我使用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。可以通過配置完成。或者我們是否需要在創建存根時每次指定它。
我使用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。可以通過配置完成。或者我們是否需要在創建存根時每次指定它。
從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
以保證完整性。)
希望有幫助!
添加以下到我的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'中。這樣它不會添加額外的參數。 –
我已更新代碼以解決@kwerle指出的問題。時間戳現在被合併到'stubs'散列中,以便可以傳入其他存根並且不會有衝突。 –