代码之家  ›  专栏  ›  技术社区  ›  nkr1pt

我在单元测试中是否犯了根本错误?

  •  12
  • nkr1pt  · 技术社区  · 14 年前

    例如,当我创建一个使用mock的测试时,我记录对特定mock的所有调用并分配返回值。 现在,无论出于什么原因,当我更改实际代码的实现时,很多测试都会中断,因为mock不期望调用,这迫使我也更新单元测试,并有效地迫使我实现每一个更改两次。。。 这种情况经常发生。

    这个问题是使用mock固有的吗?我应该学会接受它吗?还是我做了一些根本错误的事情? 请启发我:)

    4 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    8 年前

    当我创建一个使用mock的测试时, 我把所有的电话都录下来 模拟并分配返回值

    听起来你可能过分强调了自己的期望。

    尝试在测试中构建尽可能少的设置代码:stub(而不是expect)所有与当前测试无关的行为,并且只指定使测试工作所必需的返回值。

    This answer 包括一个简明的例子(以及另一个更详细的解释)。

        2
  •  4
  •   Arne Deutsch    14 年前

    我的经验是只在(子)系统的边界使用mock。如果我有两个密切相关的类,我不会模仿它们,而是一起测试它们。一个例子可能是一个复合和一个访问者。如果我测试了一个具体的访问者,我就不会对合成使用mock,而是创建真正的合成。有人可能会说这不是单元测试(取决于什么是单元的定义)。但这并不重要。我想要达到的是:

    1. 编写可读的测试(大多数情况下,没有模拟的测试更容易阅读)。
    2. 只测试代码的一个重点区域(在本例中是concreate访问者和组合的相关部分)。

    测试行为而不是状态一开始看起来很好,但一般来说,我会测试状态,因为生成的测试很容易维护。嘲弄是一门大炮。不要用大锤敲螺母。

        3
  •  3
  •   Guffa    14 年前

    如果您是因为测试中断而修复测试,那么您就没有按预期使用它们。

        4
  •  0
  •   Eric Pohl    14 年前

    要求 方法,而不是实现。有时这可能意味着使用一个模拟对象,因为交互是必需的,但通常最好测试方法的返回值或对象状态的变化。