2011-11-03 41 views
0

我在Rails 3.1應用程序中有一個Contacts表。我希望last_name接受40個字符,所以在我的模型中我寫了:length => { :maximum => 40 }。但是,我的遷移中的拼寫錯誤創建了:limit => 30的last_name列。使用.new或.create!何時使用Rspec測試Rails模型?

我不知道爲什麼我的Rspec的測試沒有抓到這一點:

it "should allow last_name up to max length" do 
    long_field = "a" * 40 
    Contact.new(@attr.merge(:last_name => long_field)).should be_valid 
end 

後來我意識到,唯一的檢查模式。如果我使用.create!相反,測試失敗很好:

it "should allow last_name up to max length" do 
    long_field = "a" * 40 
    Contact.create!(@attr.merge(:last_name => long_field)).should be_valid 
end 

所以現在的問題是,我的測試模型時,我就應該總是用.create!?或者那太慢了?我還能如何確保我的模型和數據庫定義不衝突?

這也讓我想知道如果我應該只留下字符串作爲255在數據庫中,只檢查模型中的長度。

回答

2

爲了速度的原因,您應該儘可能多地使用.new。爲了讓你的測試失敗,你應該使用validates_length_of。至於字符串長度,理想情況下它們應該匹配,如果感覺過度徹底,可以使用reflect on validations和Model.columns來驗證您是否對每列進行了驗證。

+0

最後回到這一個細節。我使用':validates:length'而不是':validates_length_of',但是如果rspec測試使用':new',任何一個都可以讓測試通過。換句話說,如果模型驗證器是正確的,但數據庫字段太短,':new'測試通過,因爲它不寫入數據庫。我不認爲反思會有幫助,因爲它也沒有檢查數據庫。似乎奇怪的是,遷移<->模型同步是一個手動過程。到目前爲止,':create!'是我看到測試數據庫接受模型將給它的唯一方法。 –