【问题标题】:Best way to Overload Methods in Rails 3?在 Rails 3 中重载方法的最佳方法?
【发布时间】:2011-08-25 23:36:25
【问题描述】:

我正在使用默认的 Rails 测试。

在一项测试中,我重载了 Date.today 方法:

class Date
  def  self.today
    Date.new(2011,7,19)
  end
end

这对于该文件中的测试非常有效,但会延续到其他测试并导致它们失败。如何将此代码的效果限制在单个文件中?

我认为这可能不是进行测试的最佳方式。有没有推荐的分步教程?

谢谢。

Rails 3.07

【问题讨论】:

  • 你可能想要一个模拟对象。搜索 Ruby mock object gems,有几个可供选择。
  • 另外,如果这仅适用于日期和时间,请参阅gist.github.com/1033857(您可以尝试 Timecop,但我会警告您,它与 DST 存在问题,可能并且会破坏您的测试)。
  • Mocha 如何重载 Date 对象?您如何防止该覆盖延续到其他测试?代码去哪儿了?在测试文件中的测试类之前?在测试帮助文件中?
  • mocha.rubyforge.org/examples/misc.html 的例子。 Date.expects(:today).returns(Date.new(2011, 7, 19))。您不需要重置任何东西......它会挂接到单元测试框架中以在测试完成后重置。
  • 谢谢,它成功了(使用stubs 而不是expects)。

标签: ruby-on-rails ruby-on-rails-3 unit-testing tdd overloading


【解决方案1】:

感谢 d11wtq 提供上述代码。

我是这样做的:

  1. $gem install 'mocha'
  2. 在 Gemfile 中将 gem 'mocha' 添加到组 :test(见下文)
  3. $bundle install
  4. 在model_test.rb文件中,在require 'test_helper'之后在线添加require 'mocha'
  5. 在 model_test.rb 中的 ModelTest 类中添加了以下 3 行:
设置做 Date.stubs(:today).returns(Date.new(2011, 7, 19)) 结尾

我发现这篇文章对 Mocha 很有帮助:http://yarorb.wordpress.com/2007/11/26/mocks-and-stubs-in-ruby-on-rails-the-mocha-solution/

编辑:更多信息:

我发现您需要添加以下内容以在每次测试后删除存根。我把这个放在设置方法之后:

拆解做 Date.unstub(:今天) 结尾

而且,我认为您还需要以下 gem 到 Gemfile 中的 :test 组: gem 'test-unit', '1.2.3'

【讨论】:

  • 感谢 B 七花时间记录您的最终解决方案。其他 SO 用户将感谢您抽出宝贵的时间,我很乐意投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2011-02-25
相关资源
最近更新 更多