如何模拟类并设置方法以返回私有变量



在我开始这个之前,这似乎是微不足道的,但我不能让它工作。

这段代码是问题的基本要素。

我有一个类,它有一个私有变量,我可以通过调用一个方法来检索它的值。

public class CheckItOut {
private bool authenticated = false;
public CheckItOut(){}
public bool IsAuthenticated(){
return authenticated;
}
}

然后我有一个模拟这个类的testclass,并通过构造函数将它注入到正在测试的类中。

.
.
.
Mock<CheckItOut> mockedCheckItOut = new Mock<CheckItOut>();
mockedCheckItOut.Setup(x => x.IsAuthenticated()).Returns(true);
Controller sut = new Controller(mockedCheckItOut);
.
.
.

当我逐步执行测试代码并到达.Setup时,我得到以下错误

System.NotSupportedException: 'Unsupported expression: x => x.IsAuthenticated()
Non-overridable members (here: CheckItOut.IsAuthenticated) may not be used in setup 

我不明白。我没有对CheckItOut的任何成员做任何事情。我用自己的实现来模拟/替换一个返回true的方法调用。

有谁能看出我做错了什么吗?

感谢您的宝贵时间。

这里的问题是,您试图模拟类的非虚拟成员/函数。这是Moq(或任何mock框架)无法做到的。如果你想模拟你的类,你必须将IsAuthenticated函数定义为virtual。

在测试中对对象进行更多控制的更好方法是为类使用接口。这样,您就可以模拟测试对象的所有公共行为。

相关内容

  • 没有找到相关文章

最新更新