我们可以强制rspec stub_model将created_at列填充到Time:now

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.可以通过配置完成.或者我们是否需要在创建存根时每次指定它.

Chr*_*erg 6

源代码来看,默认情况下似乎不可能.这为您提供了一些选择:

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完整性.)

希望有所帮助!