【问题标题】:Can we force rspec stub_model to populate created_at column to Time:now我们可以强制 rspec stub_model 将 created_at 列填充到 Time:now
【发布时间】:2012-11-27 12:07:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    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,以确保完整性。)

    希望有帮助!

    【讨论】:

    • 我已更新代码以解决@kwerle 指出的问题。时间戳现在合并到stubs哈希中,这样其他stubs可以传入,不会发生冲突。
    【解决方案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”时遇到了问题,因为它向存根调用添加了一个附加参数。

    【讨论】:

    • 感谢您指出这一点!我已经更新了我的答案来解决这个问题。我的修复与你的有点不同:我将*args 切换为stub_model, stubs={},然后将时间戳合并到stubs。这样就不会添加额外的参数了。
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2021-01-15
    • 2022-11-13
    • 2014-07-26
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多