4

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

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

我只是好奇 Osherove 的建议可以多么容易地转换为编码标准。

[1]: http://被测系统根本没有被测试,取而代之的是从模拟返回的数据是正在测试的。

4

7 回答 7

2

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

框架是否使用类似的命名约定取决于其设计者,但标准(如果您同意他的建议)应该是每次测试只执行一个断言,并且断言需要一个假对象 - 只有一个假对象应按测试进行测试。

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

于 2011-01-05T16:01:27.857 回答
2

Philip Calçado 最近写了这篇文章:http: //fragmental.tw/2010/12/14/one-mock-per-test-considered-not-awesome/。简而言之,他说专注于测试中有多少模拟/存根会转移您应该关注的主要问题:编写良好的规范。

于 2011-01-05T16:32:50.563 回答
1

像 Moq 这样的框架无法区分它们。FakeItEasy 更进一步,称一切为假对象。

是的,它们可以应用,因为模拟只是更智能的存根。只要您不在一个以上的模拟上断言,存根是否被称为模拟并不重要。换句话说,该建议更多地是关于每次测试只断言一件事。明确区分模拟和存根并不是那么重要。

于 2011-01-05T15:58:40.220 回答
1
> can those recommendations 
> [a single unit test should contain between 0 and 1 mocks] 
> be applied to all isolation frameworks ?

我认为:大多数时候的,如果你假设这些定义

  • Unittest = 单独测试(否则它不是单元测试)
  • 一项功能的一项单元测试
  • 存根或假对象是允许隔离但没有验证功能的对象,并且
  • 模拟是具有额外功能的存根,还允许验证
于 2011-01-05T16:14:58.347 回答
0

Moq用于我的 Mocking在这里获取

我不确定您对“存根”的确切含义,但我认为这可能Moles from Microsoft是非常酷的东西。这里

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

于 2011-01-05T15:59:30.950 回答
0

这种规则应该被视为“训练轮”。显然,一个包含许多 stub 和 mock 的测试已经失去了情节,但是坚持每个测试只有一个断言或期望是太严格了。正如引用的 Calçado 链接所指出的那样,重要的是每个测试都有一个概念,这可能涉及一些断言或期望来说明这一点。您应该做的最后一件事是执行这样的标准。

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

于 2011-01-06T12:38:47.350 回答
-1

我在 C# 中使用 Rhino mock 进行测试。您可以使用它生成模拟或存根。我鼓励你看看这个框架:http ://www.ayende.com/projects/rhino-mocks.aspx

于 2011-01-05T15:56:24.570 回答