起订量自定义的IIdentity(Moq custom IIdentity)

2019-10-17 03:20发布

我创建了一个自定义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,克里斯。

Answer 1:

你应该嘲笑的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一个模拟。

- 编辑

答案在评论质疑。



Answer 2:

你嘲笑对接口的IIdentity,或嘲讽与您自定义类型?

无需更全面的代码片段看,我猜测它是抱怨IsAuthenticated没有标记为您的自定义实现虚拟。 然而,这只能是如果你对具体类型,而不是接口嘲讽。



文章来源: Moq custom IIdentity