Moq测试无效方法

J. *_*son 10 c# nunit unit-testing moq

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

 public interface IAdd
 {
     void add(int a, int b);
 }
Run Code Online (Sandbox Code Playgroud)

IAdd接口的Moq 是:

  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;
Run Code Online (Sandbox Code Playgroud)

由于该add方法为void,因此它不会向Assert返回任何值.我该如何断言这个设置?

Ser*_*kiy 20

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

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

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

因此,您应该IAdd仅为使用IAdd接口的测试对象模拟接口.


Pav*_*shy 17

更好地提供更多上下文,但通常使用如下:

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

//do something here what is using mockAdd.Add

mockAdd.VerifyAll();
Run Code Online (Sandbox Code Playgroud)

  • Pavel,你能解释一下//在这里做一些使用mockAdd.Add的东西吗?我遇到了类似的问题而且不确定要添加什么"//在这里做些什么是使用mockAdd.Add" (2认同)