10

在阅读 Martin Fowler 的Mocks Aren't Stubs之后,我发现我一直在以“mockist”的方式练习 TDD。

但我想知道,即使在 mockist TDD 中,如果一个人可以把嘲笑做得太过分。

这是Python 风格的伪代码的更新示例:

def sync_path(self):
    if self.confirm_or_create_connection():
        self.sync(self.dirpath)

confirm_or_create_connection() 方法创建到服务器的连接。

我在两个测试中测试了与此类似的方法,这两个测试都模拟了 confirm_or_create_connection() 和 sync() (即使它们都是同一个类中的方法)。在一个测试中,mock confirm_or_create_connection() 返回 True 并且测试确认 sync() 被调用,而在另一个测试中 mock confirm_or_create_connection() 返回 False 并且测试确认 sync() 没有被调用。

这合理吗?或者我应该模拟 confirm_or_create_connection() 和 sync() 调用的对象?(我已经对这两种方法进行了其他测试。)

请不要通过解释我应该练习“经典” TDD 来回答这个问题。这是另一个问题的答案:我应该练习 mockist 还是经典 TDD?

4

7 回答 7

8

出于某种原因,该技术被称为“模拟对象”,而不是“模拟方法”。它鼓励将系统划分为易于组合、协作的对象并远离程序代码的设计。目的是提高抽象级别,以便您主要通过组合对象进行编程,而很少编写低级控制流语句。

于 2009-05-23T16:37:48.950 回答
5

就我个人而言,我认为嘲笑自我几乎总是一种代码味道。它正在测试实现而不是行为。

于 2008-10-08T21:07:14.617 回答
4

编辑更新样本:

我现在明白了。你在测试这个类时遇到了问题,因为它有设计缺陷。这个类违反了单一职责原则。它正在做两件事。首先,它管理与数据库的连接。它也在同步。

您需要一个单独的类来管理您的数据库连接。该类将成为被测类的依赖项。当您对被测类进行单元测试时,可以伪造数据库连接类。

以前:

作为一名交互测试人员,如果您需要这样做,请考虑重构。那堂课可能做得太多了。

让我这样告诉你:调用私有方法不会进行交互。

这是TDD的要点之一。当它受到伤害时,您的设计可以得到改进。

于 2009-05-15T18:52:32.163 回答
1

为新示例编辑对
我来说,您似乎在存根confirm_or_create_connection,您只对定义返回调用感兴趣并且您正在模拟同步,在这里您有兴趣测试它是否真的被调用。(我必须检查我对 stubbing 或 mocking 的定义是否与您引用的 fowler 文章相同。我已经有一段时间没有阅读它了,我一直在 c# 中使用 rhinomocks 可能有它自己的定义这些条款:-))

我认为对于您正在测试的内容,模拟和存根这些调用是正确的方法。如果其中一个功能出现错误,您不想测试失败,还有其他测试。您只是想测试sync_path 的操作。

我同意 Avdi 的观点,即这有点臭。测试还可以,但你的班级可能做得太多了。

于 2008-10-08T20:43:54.430 回答
1

疯狂地猜测,看起来连接活动可能属于另一个应该委托给的对象,在这种情况下你可以模拟那个. 我通常建议不要模拟对象的一部分来测试另一部分。它表明有两个概念被栓在一起。

于 2009-05-21T16:48:55.050 回答
0

你能把嘲弄过分吗?我不知道太远,但它可能做得很糟糕,以至于你实际上是在测试模拟而不是代码,或者更糟糕的是你有脆弱的测试。

但只要你编写好的测试——确认你预期行为的测试,帮助你编写代码的测试——然后模拟!

于 2008-11-17T00:39:15.047 回答
0

这是一个很好的阅读:“原则:不要修改 SUT”,位于http://xunitpatterns.com/Principles%20of%20Test%20Automation.html#Don

通过模拟或存根部分实现来修改您正在测试的类是一种代码味道。摆脱它的重构是将您正在模拟/存根的部分移动到另一个类。也就是说,它并不总是一件可怕的事情。它是一种代码气味,但并不总是不合适的。对于像 C# 或 Java 这样的语言,你有很好的重构工具,很容易修复这种代码气味,我通常会(在 C# 中,假设 Java 是相似的)。不过,我在 Lua 和 Javascript 中做了很多开发,但情况有些不同。用这些语言创建和管理大量类更加困难,因此我更能容忍在测试中修改 SUT。一旦最初的测试覆盖率在那里,我总是可以稍后修复它。它确实需要额外的照顾。

于 2010-02-19T17:46:15.903 回答