我正在使用 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/