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

时间:2012-11-27 12:07:02

标签: ruby-on-rails-3 rspec rspec-rails twitter-bootstrap-rails

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

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

2 个答案:

答案 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”的问题,因为它为存根调用添加了一个额外的参数。