首页 文章

Moq测试无效方法

提问于
浏览
9

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

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

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;

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

2 回答

  • 20

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

    你应该 never assert on value returned by mock . 这是与 生产环境 代码无关的虚拟值 . 您应该断言的唯一值是SUT返回的值 . SUT是唯一应该为其编写断言的东西 .

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

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

  • 14

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

    var mockAdd = new Mock<IAdd>();
    mockAdd.Setup(x => x.Add(1, 2)).Verifiable();
    
    //do something here what is using mockAdd.Add
    
    mockAdd.VerifyAll();
    

相关问题