C# 模拟对象的标准

C# 模拟对象的标准,c#,unit-testing,mocking,standards,isolation-frameworks,C#,Unit Testing,Mocking,Standards,Isolation Frameworks,在Roy Osherove的书[Unit Testing][1]中,他解释了单个单元测试应该包含0到1个模拟。他建议,如果您的测试没有在mock上断言,那么根本不要使用mock。他进一步演示了如何使用隔离框架来生成存根,存根的创建方式与mock类似。他对每次测试创建的存根数量没有建议的限制 我的问题是:这些建议能应用于所有的隔离框架(或所有流行的C#框架)吗?换句话说,是否有一个框架可以只生成mock而不是stub?是否有一个不区分mock和stub的隔离框架 我只是好奇Osherove的建议能

在Roy Osherove的书[Unit Testing][1]中,他解释了单个单元测试应该包含0到1个模拟。他建议,如果您的测试没有在mock上断言,那么根本不要使用mock。他进一步演示了如何使用隔离框架来生成存根,存根的创建方式与mock类似。他对每次测试创建的存根数量没有建议的限制

我的问题是:这些建议能应用于所有的隔离框架(或所有流行的C#框架)吗?换句话说,是否有一个框架可以只生成mock而不是stub?是否有一个不区分mock和stub的隔离框架

我只是好奇Osherove的建议能多么容易地转化为编码标准


[1] :被测系统根本没有被测试,相反,从模拟返回的数据就是被测试的数据。

我在C#中使用Rhino mock进行测试。您可以使用它生成模拟或存根。我鼓励您看看这个框架:

有一些像Moq这样的框架没有区分它们。Fakeitesy甚至更进一步,称所有东西都是假的


是的,它们可以应用,因为mock只是更聪明的存根。只要不在多个mock上断言,存根是否被称为mock并没有多大关系。换句话说,这个建议更多的是关于每个测试只断言一件事。明确区分mock和stub并不重要。

我使用
Moq
进行模拟

我不知道你说的“存根”到底是什么意思,但我想可能是微软的Moles,这很酷


两者都非常有趣且易于使用。

这直接对应于Osherove的建议,即每个测试只执行一个断言。在他的词典中,
stub
是一个向被测系统提供假输入的类,而
mock
是一个允许您测试被测系统输出的类(使用假类)

框架是否使用类似的命名约定取决于它的设计者,但标准(如果您同意他的建议)应该是每个测试只执行一个断言,如果断言需要一个伪对象,那么每个测试只应测试一个伪对象

当然,并不是每个人都同意他的建议,所以也不是每个人都这样做

> can those recommendations 
> [a single unit test should contain between 0 and 1 mocks] 
> be applied to all isolation frameworks ?
我想:如果你假设这些定义,大多数时候都是肯定的

  • Unittest=单独测试(否则它不是Unittest)
  • 一个特性的一个单元测试
  • 存根或伪存根是允许隔离但没有验证功能和
  • 模拟是一个存根,具有额外的功能,也允许验证

Philip Calçado最近写道:。简言之,他说,关注测试中有多少模拟/存根会转移你的注意力:编写好的规范。显然,一个包含许多存根和模拟的测试已经失去了意义,但是坚持每个测试都有一个断言或期望太严格了。正如引用的Calçado链接所指出的,重要的是每个测试都有一个概念,这可能需要一些断言或期望来证明这一点。你最不应该做的就是执行这样一个标准


还有一件事,我们真的应该在这里讨论“期望”,个体交互,而不是整个模拟对象。实际上,它们通常是相同的,但概念模糊了。

链接中有一条有趣的评论——有两个或更多的模拟表示集成测试,而不是单元测试。如果你仔细阅读这一部分,Calçado谈论的是集成测试的多个概念,而不是多个期望/断言