C# 模拟对象的标准
在Roy Osherove的书[Unit Testing][1]中,他解释了单个单元测试应该包含0到1个模拟。他建议,如果您的测试没有在mock上断言,那么根本不要使用mock。他进一步演示了如何使用隔离框架来生成存根,存根的创建方式与mock类似。他对每次测试创建的存根数量没有建议的限制 我的问题是:这些建议能应用于所有的隔离框架(或所有流行的C#框架)吗?换句话说,是否有一个框架可以只生成mock而不是stub?是否有一个不区分mock和stub的隔离框架 我只是好奇Osherove的建议能多么容易地转化为编码标准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的建议能
[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)
- 一个特性的一个单元测试
- 存根或伪存根是允许隔离但没有验证功能和
- 模拟是一个存根,具有额外的功能,也允许验证
还有一件事,我们真的应该在这里讨论“期望”,个体交互,而不是整个模拟对象。实际上,它们通常是相同的,但概念模糊了。链接中有一条有趣的评论——有两个或更多的模拟表示集成测试,而不是单元测试。如果你仔细阅读这一部分,Calçado谈论的是集成测试的多个概念,而不是多个期望/断言