有什么方法可以验证模拟或存根是否有效?

时间:2011-03-10 15:06:12

标签: ruby unit-testing tdd mocking

假设我有一个使用以下代码

定义的类和方法
class Book
  def quick_info
    return title + " " + author
  end
end

如果我在一些使用此Book类的其他类上编写单元测试,我会为Book.quick_info的方法调用创建一个存根。

现在我发现如果我的Book类要更改,则会出现问题,例如quick_info方法已重命名为short_description。我的单元测试仍然会使用quick_info,看起来我的测试通过就好了,实际上它应该是失败的。

我想知道是否有一些东西可以运行来验证我的测试中的存根/模拟实际上是由正确的类和方法组成的。也许这样的东西可以在持续集成服务器上运行,只是为了验证事情是否匹配?

Hrmm ....现在我想到了一个想法。甚至可以创建一个不存在的mock / stubbed方法吗?如果没有,那么这整个问题都没有实际意义。

修改

我刚刚尝试使用rspec 2,我知道我可以创建一个Book实例并创建一个名为i_dont_exist的方法,我可以调用它。所以我的问题仍然存在。有没有办法验证我的模拟/存根是否与实际存在的类/对象匹配?

1 个答案:

答案 0 :(得分:4)

Mocha有一个选项:

Mocha::Configuration.prevent(:stubbing_non_existent_method)

虽然它要求您模拟现有对象。 如果你从'scratch'创建一个模拟它将无法工作(因为它不知道应该有什么方法)。

就最佳实践而言,恕我直言,你正在从错误的方向看待它。 您还应该对Book类进行单元测试,因此在重命名方法时会出现测试失败。这应该是足够强大的信号来'grep'代码,看看是否有更多的调用此方法。

另外(除非这只是一个例子)为什么你还想要模拟Book?它只是一个数据 - 您通常希望模拟外部服务等,并在测试中使用真实数据对象。