3

我正在使用 twitter bootstrap gem 生成在索引页面中显示 created_at 列的视图。与脚手架一起生成的 rspec 测试使用 stub_model 来测试索引视图。这些测试失败,因为 created_at 列为零。

就像 stub_model 生成为 dummy id 一样,它是否也可以将 created_at 列设置为 Time.now。可以通过配置完成吗?或者我们是否需要在创建存根时每次都指定它。

4

2 回答 2

6

源代码来看,默认情况下这似乎是不可能的。这给您留下了几个选择:

1.created_at每次创建模型存根时指定值:

m = stub_model(MyModel, :created_at => Time.now)

2.创建自己的辅助方法,created_at在初始化存根后设置属性:

module Helpers
  def stub_model_with_timestamp(model_class, stubs={})
    stub_model(model_class, { :created_at => Time.now }.merge(stubs))
  end
end

然后只需包含该模块,spec_helper.rb以便它在所有规格中都可用:

RSpec.configure do |config|
  include Helpers
  ...
end

3.如果您真的想按stub_method原样使用,您可以通过重新打开模块并为原始方法设置别名来对 rspec-rails 进行猴子补丁以使其按照您想要的方式工作:

module RSpec::Rails::Mocks
  def stub_model_with_timestamp(model_class, stubs={})
    stub_model_without_timestamp(model_class, { :created_at => Time.now }.merge(stubs))
  end

  alias_method_chain :stub_model, :timestamp
end 

把它放在一个文件中spec/support/,它会自动加载,所以当你存根模型时,它会自动设置created_at时间戳。

最后一点,我认为这是其他人可能也想使用的有用功能,因此您可以考虑实际向rspec-rails发出拉取请求,将默认设置添加为配置选项。(我想如果你这样做,你可能也想设置updated_at,以保持完整性。)

希望有帮助!

于 2012-11-27T13:54:55.833 回答
2

我在我的 spec_helper.rb 中添加了以下内容:

module RSpec::Rails::Mocks
  def stub_model_with_timestamp(*args)
    stub_model_without_timestamp(*args).tap{|o| o.created_at ||= Time.now }
  end

  alias_method_chain :stub_model, :timestamp
end

另一个解决方案在“*args, :created_at => Time.now”方面存在问题,因为它向存根调用添加了一个附加参数。

于 2012-12-07T22:18:50.177 回答