我的用户模型要求密码至少包含一个大写字母。我的规范写成如下:
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
最佳答案
我只能得出结论,您正在执行的代码与所显示的代码不同。您的RSpec失败消息表明您期望errors数组包含一个包含所讨论字符串的数组,而不是期望它包含字符串本身。可能是此错误消息是由运行包含....with_message(["..."])
而不是您所显示内容的规范引起的吗?
关联的shoulda代码非常简单。参见https://github.com/thoughtbot/shoulda-matchers/blob/d680e7d47ba0d0bc6eba888cc4648f65b61ac2cf/lib/shoulda/matchers/active_model/allow_value_matcher.rb的第120行
关于ruby-on-rails - 用于自定义验证的Shoulda Matchers with_message错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17953742/