2010-01-05 49 views
5

我正在使用Shoulda與Test :: Unit組合在我工作的其中一個項目上。我遇到的問題是,我最近改變了這一點:Shoulda:測試validates_presence_of:on =>:更新

class MyModel < ActiveRecord::Base 
    validates_presence_of :attribute_one, :attribute_two 
end 

這樣:

class MyModel < ActiveRecord::Base 
    validates_presence_of :attribute_one 
    validates_presence_of :attribute_two, :on => :update 
end 

以前,我(通過)的測試是這樣的:

class MyModelTest < ActiveSupport::TestCase 
    should_validate_presence_of :attribute_one, :attribute_two 
end 

由於據我所知,沒有參數should_validate_presence_of將導致此測試繼續通過上述指定的更改。在測試:attribute_two的要求時,放棄Shoulda是否有辦法解決這個問題?

回答

2

在過去的我剛剛用一個小的自定義應該阻止來解決這個問題:

should "require :attr_two on update" do 
    mm = Factory(:my_model) 
    mm.attr_two = nil 
    mm.save 
    assert_equal false, mm.valid? 
    assert_equal("can't be blank", mm.errors.on(:attr_two)) 
end 

希望早該將繼續允許在未來進一步AR驗證選項改善。讓我知道你在想什麼,歡呼。

2

我試過類似於tsdbrown建議的解決方案。這種類型的測試通過時,我有:
validates_presence_of:attr_two

但如果我更改模型,以測試失敗:
validates_presence_of:attr_two,:上=>:保存

它失敗,因爲: attr_two錯誤是[]而不是[ 「不能爲空」]

2

在Rspec的,你可以做到以下幾點:

describe MyModelTest do 
    describe "validations" do 
    should_validate_presence_of :attribute_one 

    context "on update" do 
     subject { FactoryGirl.create(:my_model_test) } 

     should_validate_presence_of :attribute_two 
    end 
    end 
end 
3

什麼像THI S' (用於shoulda-matchers-3.1.1

subject { FactoryGirl.build(:your_model) } 
it { is_expected.to validate_presence_of(:attribute_one) } 
it { is_expected.to validate_presence_of(:attribute_two).on(:update) }