3

我使用twitter bootstrap gem來生成顯示索引頁中created_at列的視圖。與腳手架一起生成的rspec測試使用stub_model來測試索引視圖。這些測試因nil中的created_at列而失敗。我們可以強制rspec stub_model將created_at列填充到Time:now

就像stub_model生成爲虛擬ID一樣,它是否也可以將created_at列設置爲Time.now。可以通過配置完成。或者我們是否需要在創建存根時每次指定它。

回答

6

source code來看,這在默認情況下似乎不可行。這使你有幾個選擇:

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

2.創建這之後設置created_at屬性自己的helper方法:

每次創建模型存根時指定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模塊,因此可在一個LL規格:

RSpec.configure do |config| 
    include Helpers 
    ... 
end 

3.如果你真的想用stub_method原樣,你可以猴子補丁RSpec的護欄,使之通過重新打開模塊和走樣工作,你所希望的方式原始的方法:

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

希望有幫助!

+0

我已更新代碼以解決@kwerle指出的問題。時間戳現在被合併到'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」,因爲它增加了存根調用一個額外的參數。

+0

感謝您指出這一點!我已經更新了我的答案來解決這個問題。我的解決方法與你的有點不同:我將'* args'切換爲'stub_model,stubs = {}',然後將時間戳合併到'stubs'中。這樣它不會添加額外的參數。 –

相關問題