如何模拟 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 行为以进行测试。