如何取消Mocha模拟?

时间:2011-09-12 18:27:07

标签: ruby-on-rails ruby-on-rails-3 tdd mocking mocha

我有以下mocha模拟效果很好。

在test.rb文件中:

setup do
  Date.stubs(:today).returns(Date.new(2011, 7, 19)) 
  Time.stubs(:now).returns(Time.new(2011,1,1,9,0))
end

问题是测试的时机被打破了。测试运行后,日期和时间对象仍然被模拟。(!)

Finished in -21949774.01594216 seconds.

我添加了以下内容:

teardown do
  Date.unstubs(:today)
  Time.unstubs(:now)
end

这会为每个测试引发以下错误:WARNING: there is already a transaction in progress

这是取消存放的正确方法吗?在测试文件的末尾或甚至在单元测试套件的末尾取消存储是否更好?

使用Rails 3.07和Mocha 0.9.12

感谢。

2 个答案:

答案 0 :(得分:10)

我不知道这是否完全是你的问题,但它只是unstub,而不是多元化。

除此之外,应该没有问题。你肯定想在每次测试(或一组测试,如果一堆测试需要存根)之后取消存储,因为一旦存根,它将保持存根,这可能会搞砸其他测试。

答案 1 :(得分:5)

接受的答案是传播错误信息,应被视为有害。

像Mocha这样的模拟库的主要目的之一是提供自动模拟/存根拆解作为与各种测试库集成的一部分。事实上,如果你看一下GitHub repo for Mocha,你会看到为了使Mocha与几个不同测试框架的所有版本一起顺利运行,我们将付出大量的维护工作。

如果这不能正常工作,那么你需要弄清楚为什么Mocha的内置拆解不起作用。在您自己的拆解中手动取消打印只是在解决问题,并且可以隐藏更短的问题,如存根漏洞或摩卡否则行为不端。

如果我不得不采取疯狂的猜测,你的存根上的钱会以某种方式在实际测试之外运行,因为这是我在野外看到的这种事情最常见的原因,但是没有足够的信息来自真正确定的问题。