我创建了一个自定义RoleProvider(标准web表单,没有MVC),我想对它进行测试。 提供者本身的IIdentity的自定义实现(有一些附加属性)集成。
我有这样的时刻:
var user = new Mock<IPrincipal>();
var identity = new Mock<CustomIdentity>();
user.Setup(ctx => ctx.Identity).Returns(identity.Object);
identity.SetupGet(id => id.IsAuthenticated).Returns(true);
identity.SetupGet(id => id.LoginName).Returns("test");
// IsAuthenticated is the implementation of the IIdentity interface and LoginName
然而,当我运行该测试在VS2008然后我得到以下错误信息:
一个非可重写的构件上无效设置:ID => id.IsAuthenticated
这究竟是为什么? 而最重要的是,我需要做什么才能解决呢?
GRZ,克里斯。
你应该嘲笑的IIdentity(而不是CustomIdentity - 只有当您嘲讽变量在接口声明可能),或者为虚拟声明中使用的变量。
标记为虚,这样做:在你的具体类CustomIdentity,使用
public virtual bool isAuthenticated { get; set; }
代替
public bool isAuthenticated { get; set; }
起订量等免费嘲弄框架不会让你模拟成员和具体类类型的方法,除非它们被标记虚拟。
最后,您可以创建手动嘲笑自己。 你可以继承CustomIdentity到测试类,你想这将返回的值。 就像是:
internal class CustomIdentityTestClass : CustomIdentity
{
public new bool isAuthenticated
{
get
{
return true;
}
}
public new string LoginName
{
get
{
return "test";
}
}
}
这个类在测试中仅用于,为您CustomIdentity一个模拟。
- 编辑
答案在评论质疑。
你嘲笑对接口的IIdentity,或嘲讽与您自定义类型?
无需更全面的代码片段看,我猜测它是抱怨IsAuthenticated没有标记为您的自定义实现虚拟。 然而,这只能是如果你对具体类型,而不是接口嘲讽。