Kum*_*san 3 rspec rspec-rails ruby-on-rails-3 twitter-bootstrap-rails
我使用twitter bootstrap gem生成在索引页面中显示created_at列的视图.与脚手架一起生成的rspec测试使用stub_model来测试索引视图.这些测试失败,因为created_at列为nil.
就像stub_model生成虚拟id一样,它也可以将created_at列设置为Time.now.可以通过配置完成.或者我们是否需要在创建存根时每次指定它.
从源代码来看,默认情况下似乎不可能.这为您提供了一些选择:
1.created_at每次创建模型存根时指定值:
m = stub_model(MyModel, :created_at => Time.now)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然后只需包含该模块,spec_helper.rb以便所有规格都可用:
RSpec.configure do |config|
include Helpers
...
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
将其放入文件中spec/support/并自动加载,因此当您存根模型时,它会自动设置created_at时间戳.
作为最后一点,我认为这是其他人可能也想要使用的有用功能,因此您可能会考虑实际向rspec-rails发出拉取请求,并将默认设置添加为配置选项.(我想如果你这样做了,你可能也想要updated_at完整性.)
希望有所帮助!