ruby-on-rails-3 - 我们可以强制 rspec stub_model 将 created_at 列填充到时间 :now

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

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

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

最佳答案

source code来看,默认情况下这似乎是不可能的。这给您留下了几个选择:

1. 每次创建模型 stub 时指定 created_at 值:

m = stub_model(MyModel, :created_at => Time.now)

2. 创建您自己的帮助方法,在初始化 stub 后设置 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/ 的文件中,它会自动加载,所以当你 stub 模型时,它会自动设置 created_at 时间戳。

作为最后一点,我认为这是其他人可能也想使用的有用功能,因此您可以考虑实际向 rspec-rails 发出拉取请求将默认设置添加为配置选项。 (我想如果你这样做了,你可能还想设置 updated_at 以确保完整性。)

希望有帮助!

关于ruby-on-rails-3 - 我们可以强制 rspec stub_model 将 created_at 列填充到时间 :now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583928/

相关文章:

ruby-on-rails - 在 Rails 3 项目中添加自定义目录(源和规范)以进行自动测试

ruby-on-rails - 创建具有 has_one 关系的 FactoryBot 用户

ruby-on-rails - 请求规范中的 Rspec 和 Devise

ruby-on-rails - Sidekiq::测试.假的!不伪造 Sidekiq::Queue

ruby-on-rails - 应该::匹配器::独立::DelegateMethodMatcher:未定义的方法 `allow_nil'

ruby-on-rails-3 - Rails API - Versionist vs Rocket Pants

ruby-on-rails - Zurb Foundation Nav 在 Rails 项目中的风格有限

ruby-on-rails - RSpec 使用模型的旧属性字段?

ruby - 如何排除匹配特定标签的 RSpec 测试?

ruby - 如何用使用rails3-generators的工厂替换固定装置?