【问题标题】:How to unstub Mocha mock?如何取消 Mocha 模拟?
【发布时间】:2011-09-12 18:27:06
【问题描述】:

我有以下 mocha mock,效果很好。

在 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 中工作

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我不知道这是否完全是你的问题,但它只是 unstub,而不是复数形式。

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

    【讨论】:

    • 您不需要在测试之间取消存根。每个测试都从头开始。 “unstub”的用例是,如果您有一组测试将事物作为其设置的一部分存根,但该组中的某些测试不需要存根其中的一部分。
    • 如果有的话,“unstub”而不是“unstubs”是复数形式:“It unstubs, they unstub”。我觉得摩卡这里的动词选择不一致。
    【解决方案2】:

    公认的答案是传播错误信息,应该被认为是有害的。

    像 Mocha 这样的模拟库的主要目的之一是提供自动模拟/存根拆解,作为与各种测试库集成的一部分。事实上,如果您查看GitHub repo for Mocha,您会发现为了使 Mocha 能够在多个不同测试框架的所有版本上顺利运行而投入了大量的维护工作。

    如果这不能正常工作,那么您需要弄清楚为什么 Mocha 的内置拆解不能正常工作。在您自己的拆解中手动取消存根只是掩盖问题,并且可能隐藏存根泄漏或 Mocha 其他行为不端的更微妙问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多