如何模拟 class 并将方法设置为 return 私有变量
How to mock a class and setup a method to return a private variable
好吧,在我开始之前这似乎是微不足道的,但我无法让它工作。
这段代码是问题的基本要素。
我有一个带有私有变量的 class,我可以通过调用方法检索它的值。
public class CheckItOut {
private bool authenticated = false;
public CheckItOut(){}
public bool IsAuthenticated(){
return authenticated;
}
}
然后我有一个测试class模拟这个class,并通过构造函数将它注入我正在测试的class。
.
.
.
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 的任何成员做任何事情。我 mocking/replacing 一个方法调用,我自己的实现返回 true。
谁能看出我做错了什么?
谢谢你的时间。
这里的问题是您正在尝试模拟 class 的非虚拟 member/function。这是 Moq(或任何模拟框架)无法做到的事情。
如果你想模拟你的 class 你必须将 IsAuthenticated 函数定义为虚拟函数。
在测试中更好地控制对象的一种更好的方法是使用 classes 的接口。这样您就可以模拟对象的所有 public 行为以进行测试。
好吧,在我开始之前这似乎是微不足道的,但我无法让它工作。
这段代码是问题的基本要素。
我有一个带有私有变量的 class,我可以通过调用方法检索它的值。
public class CheckItOut {
private bool authenticated = false;
public CheckItOut(){}
public bool IsAuthenticated(){
return authenticated;
}
}
然后我有一个测试class模拟这个class,并通过构造函数将它注入我正在测试的class。
.
.
.
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 的任何成员做任何事情。我 mocking/replacing 一个方法调用,我自己的实现返回 true。
谁能看出我做错了什么?
谢谢你的时间。
这里的问题是您正在尝试模拟 class 的非虚拟 member/function。这是 Moq(或任何模拟框架)无法做到的事情。 如果你想模拟你的 class 你必须将 IsAuthenticated 函数定义为虚拟函数。
在测试中更好地控制对象的一种更好的方法是使用 classes 的接口。这样您就可以模拟对象的所有 public 行为以进行测试。