何时不使用模拟

时间:2011-10-21 07:58:48

标签: unit-testing testing language-agnostic mocking bdd

我有一个基类,它依赖于另一个类来进行一些特殊的缓存。我还写了特殊的缓存类。

我可以测试它,所以特殊的缓存类作为模型传递,以确保基类按预期工作,或者我可以使用真正的类来确保整个事情按预期工作。

如果我使用真正的类,我不必在测试缓存类时复制测试逻辑,因为这是它的唯一用例(暂时)。

最好的想法可能是编写两个测试(使用模拟和使用真实类),但它可能会让其他开发人员感到困惑,为什么我会测试它两次。

我应该在这里使用mock还是真正的类?

3 个答案:

答案 0 :(得分:1)

如果它能胜任,你为什么要嘲笑真正的班级呢?

我的建议是:

  • 在测试用例中测试您的类功能,缓存除外,
  • 在缓存测试用例中测试缓存

我不会对此感到困惑,只要缓存类的测试是详尽的:如果缓存导致问题,缓存测试应该失败,而不是你的外部类。

答案 1 :(得分:0)

通常,基类将依赖于另一个类,不一定用于缓存,而是用于“为我照顾XYZ”。协作类只是作为存储库。被测试的类不应该知道或关心其他类的缓存 - 否则你在那里有你可能不需要的耦合。

然后,您可以使用界面来表达这一点。我通常称我的'ILookAfterXYZ' - 我发现这种命名模式确实帮助我弄清楚我的合作课帮助我做的事情 - 然后嘲笑它。

缓存是一个性能问题,而不是行为问题。我之所以提到这个问题是因为它标记为“BDD”,但我不会在单位或系统级别使用BDD样式的测试来确定缓存之类的用途。相反,编写性能测试并使用它们来检查缓存是否有效。

答案 2 :(得分:0)

我遇到过类似的情况,我在生产代码中有一个类,它由几个单元测试支持。这些单元测试创​​建了模拟对象以传递到生产代码类中。这意味着我能够在没有任何依赖性的情况下运行单元测试。

现在,我还要求将该生产类用作BDD(使用SpecFlow)测试的一部分。这种类型的测试更集成,因为我实际创建了一个生产类所需的真实对象(而不是模拟)。

根据我的经验,我只为单元测试创​​建了一个模拟对象,同时为我的集成测试创建了一个真实对象。这是非常主观的,但对我而言,这很好。

相关问题