2015-09-17 111 views
0

我遇到了一個問題,其中對我的模型的自定義驗證導致所有shoulda驗證失敗。Shoulda Matcher自定義驗證導致所有shoulda驗證失敗

本質:

class User < ActiveRecord::Base 
    validates_presence_of :name 
    validate :some_date_validation 

    private 

    def some_date_validation 
    if date_given > birthday 
     errors.add(:birthday, "Some sort of error message") 
    end 
    end 
end 

然後在規格:

require 'rails_helper' 

RSpec.describe User, type: :model do 
    describe "shoulda validations" do 
    it { should validate_presence_of(:name) } 
    end 
end 

這將導致我的測試失敗,因爲其他的驗證將無法通過。爲什麼是這樣?

回答

3

您需要使用默認情況下有效的對象實例進行測試。

當您在Rspec測試中使用隱式主題時,Rspec將使用默認初始化程序爲您創建一個待測試對象的新實例。在這種情況下,User.new。此實例將無效,因爲name都不存在,自定義驗證也不會通過。

如果您正在使用工廠(例如factory_girl),那麼您應該創建一個User工廠,該工廠設置所有使驗證通過的屬性。

FactoryGirl.define do 
    factory :user do 
    name "John Doe" 
    date_given Time.now 
    birthday 25.years.ago 
    end 
end 

然後在您的測試

require 'rails_helper' 

RSpec.describe User, type: :model do 
    describe "shoulda validations" do 
    subject { build(:user) } 
    it { should validate_presence_of(:name) } 
    end 
end 

現在,您已經明確設置你的測試對象是你們工廠創建的User一個新實例使用它。這些屬性將被預先設置,這意味着您的實例默認是有效的,並且測試現在應該能夠正確地測試每個單獨的驗證。

+0

我認爲我的例子不是最好的。我正在使用的驗證是要求在不同對象上的字段。我想我只需要在這個工廠中創建一個有效的嵌套對象。我認爲這有幫助,謝謝。 –