12

嗨,我是 Moq 测试的新手,很难做一个简单的断言。我正在使用一个界面

 public interface IAdd
 {
     void add(int a, int b);
 }

接口的起订IAdd量为:

  Mock<IAdd> mockadd = new Mock<IAdd>();
  mockadd.Setup(x => x.add(It.IsAny<int>(), It.IsAny<int>()).callback((int a, int b) => { a+b;});
  IAdd testing = mockadd.Object;

由于该add方法是无效的,它不会向 Assert 返回任何值。我怎样才能断言这个设置?

4

2 回答 2

22

为什么使用模拟?它用于验证 SUT(被测系统)与其依赖项(应该被模拟)正确交互。正确的交互意味着使用正确的参数调用正确的依赖成员。

永远不应该断言 mock 返回的值。那是与生产代码无关的虚拟值。您应该断言的唯一值是 SUT 返回的值。SUT 是您唯一应该为其编写断言的东西。

你也不应该测试接口。因为没有什么可以测试的。接口只是一个 API 描述。它没有实现。所以,停下来想想你在这里测试什么代码?这是在您的应用程序中执行的真实代码吗?

所以,你应该只模拟IAdd接口来测试使用IAdd接口的对象。

于 2013-02-25T16:10:31.670 回答
20

最好提供更多上下文,但通常它是这样使用的:

var mockAdd = new Mock<IAdd>();
mockAdd.Setup(x => x.Add(1, 2)).Verifiable();

//do something here what is using mockAdd.Add

mockAdd.VerifyAll();
于 2013-02-25T16:04:25.767 回答