我正在使用 twitter bootstrap gem 生成在索引页面中显示 created_at 列的视图。与脚手架一起生成的 rspec 测试使用 stub_model 来测试索引视图。这些测试失败,因为 created_at 列为零。
就像 stub_model 生成为 dummy id 一样,它是否也可以将 created_at 列设置为 Time.now。可以通过配置完成吗?或者我们是否需要在创建存根时每次都指定它。
我正在使用 twitter bootstrap gem 生成在索引页面中显示 created_at 列的视图。与脚手架一起生成的 rspec 测试使用 stub_model 来测试索引视图。这些测试失败,因为 created_at 列为零。
就像 stub_model 生成为 dummy id 一样,它是否也可以将 created_at 列设置为 Time.now。可以通过配置完成吗?或者我们是否需要在创建存根时每次都指定它。
从源代码来看,默认情况下这似乎是不可能的。这给您留下了几个选择:
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
,以保持完整性。)
希望有帮助!
我在我的 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”方面存在问题,因为它向存根调用添加了一个附加参数。