2013-07-30 55 views
0

我有一個用戶模型,需要至少有一個大寫字母的密碼。我的規格寫成如下:shoulda matchers with自定義驗證缺陷

subject { User.new } 
it { should_not allow_value("test123$").for(:password).with_message("password requires an uppercase letter (\"test123$\")") } 

然而,該規範將返回以下故障:

Expected errors to include ["password requires an uppercase letter (\"test123$\")"] when password is set to "test123$", got errors: ["password requires an uppercase letter (\"test123$\")"] 

它看起來對我來說,這些錯誤陣列明確包括正確的消息。我在這裏做錯了什麼?

編輯: 下面是我試圖符合規範的驗證:

[ 
    [/[A-Z]/, "requires an uppercase letter"], 
    [/[a-z]/, "requires a lowercase letter"], 
    [/[0-9]/, "requires a number"], 
    [/[^\w]/, "requires a special character"] 
].each do |(format, message)| 
    validates :password, :format => {:with => format, 
    :message => message}, 
    :allow_blank => true 
end 

回答

0

我只能說你執行的代碼比你出什麼不同。您的RSpec失敗消息表明您期待errors數組包含一個包含字符串的數組,而不是期望它包含字符串本身。難道這個錯誤信息是由於運行了包含....with_message(["..."])的規範而不是你顯示的內容而產生的?

相關的shoulda代碼非常簡單。請參閱https://github.com/thoughtbot/shoulda-matchers/blob/d680e7d47ba0d0bc6eba888cc4648f65b61ac2cf/lib/shoulda/matchers/active_model/allow_value_matcher.rb的行120

+0

我添加了驗證的代碼,負責生成此錯誤消息。那裏有什麼新奇的東西? – user2287662

+0

您需要將其作爲代碼添加到您的問題中,以使其可讀。 –

+0

對不起,現在應該修復。 – user2287662