【问题标题】:Moq testing void methodMoq 测试作废方法
【发布时间】:2013-02-10 07:51:03
【问题描述】:

您好,我是 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 返回任何值。如何断言此设置?

【问题讨论】:

  • 你想测试什么?
  • 我正在尝试测试 add 方法,但它没有任何返回类型。如果它有 int 作为返回类型,我将测试 Assert.AreEqual(mockadd.add(2,2), 4);但是没有返回类型我如何测试 add 方法。
  • 1. 测试接口(或模拟实现)是没有意义的。 2. 如果您有一个计算某些东西的类,您可能希望以某种方式提供结果(通过返回值或该对象上的某些属性)
  • 奇怪,添加没有返回任何东西???需要寻找更好的方法名。

标签: c# unit-testing nunit moq


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗨,谢尔盖,我是这个模拟测试的新手。我想避免执行 void 方法,该方法更新数据库,有更好的方法吗?
【解决方案2】:

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

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

//do something here what is using mockAdd.Add

mockAdd.VerifyAll();

【讨论】:

  • Pavel,你能解释一下 //do something here 什么是使用 mockAdd.Add。我被困在一个类似的问题上,不知道要添加什么到“//在这里做点什么正在使用mockAdd.Add”
  • 很高兴为@PavelBakshy 注释掉的部分添加一些解释
猜你喜欢
  • 2020-08-04
  • 2014-05-14
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多