2013-02-05 25 views
4

運行我的rspec期望的自定義​​驗證程序時出現此錯誤。rails rspec預計未能進行自定義驗證

expect {@ua.save!}.to raise_error(ActiveRecord::RecordInvalid,'Validation failed: This question is no longer active') 

失敗

expected ActiveRecord::RecordInvalid with "Validation failed: This question is no longer active", got #<ActiveRecord::RecordInvalid: Validation failed: This question is no longer active.> with backtrace: 

這隻似乎是問題,我自定義的驗證。 看到這個模型:

class UserAnswer < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :question 
    validate :questionIsActive? 

    private 

    def questionIsActive? 
    errors.add(:base, "This question is no longer active.") if !self.question.is_active? 
    end 
end 

使用: 的Rails 3.2.11 Rspec的護欄2.12.2

+0

以上述方式將測試綁定到驗證消息不是一個好主意。爲什麼?如果您將來更改驗證消息的文本,則會導致測試中斷。如果你想將它綁定到I18n的消息,那會更好。或者,如果您不想將其與消息綁定,你可以改爲寫:raise_error(ActiveRecord :: RecordInvalid) – jBeas

+0

爲了約定的緣故,你最好命名自定義驗證方法'question_is_active'(或'active_question')。謂詞方法適用於那些返回布爾值的人,並且snake_case比Ruby中的camelCase更受歡迎。 – artificis

回答

8

你有一個錯字。添加期間您的字符串:

expect {@ua.save!}.to raise_error(ActiveRecord::RecordInvalid,'Validation failed: This question is no longer active.') 

注意:您目前在您的期望:

'驗證失敗:這個問題是不再有效'

但需要:

「驗證失敗:此問題不再有效。'

使其與您的驗證字符串匹配:

「這個問題是不再有效。」

+0

我知道我錯過了一些明顯的東西。謝謝 – Nicolo77