使用twitter bootstrap gem生成在索引页面中显示created_at列的视图。与脚手架一起生成的rspec测试使用stub_model来测试索引视图。这些测试失败,因为created_at列为nil。
就像stub_model生成虚拟id一样,它也可以将created_at列设置为Time.now。可以通过配置完成。或者我们是否需要在创建存根时每次指定它。
答案 0 :(得分:6)
从source code判断,默认情况下似乎不可能。这为您提供了一些选择:
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
,以确保完整性。)
希望有所帮助!
答案 1 :(得分: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”的问题,因为它为存根调用添加了一个额外的参数。