如何在自定义错误信息的情况下使用 `should validate_presence_of`?

27

我正在使用 Rspec 测试我的 ActiveRecord 模型。 我刚刚在其中一个验证中添加了自定义错误消息,就像这样:

validates :accepted_terms_at, :presence => {:message => 'You must accept the Terms and Conditions to use this site.'}

现在以下测试失败:

it { should validate_presence_of(:accepted_terms_at) }

...在错误信息中涉及到了当accepted_terms_at为nil时不能是空的错误。

因此,测试用例失败是因为它正在查找验证错误消息,并期望找到默认消息。

我该如何告诉Rspec新的验证消息应该是什么?

我尝试过的方法

1)将消息作为参数:

it {should validate_presence_of(:accepted_terms_at, :message => 'your message')}

这会导致错误wrong number of arguments(2 for 1)

2)将消息作为链式方法调用:

it {should validate_presence_of(:accepted_terms_at).with('your message')}

这会抛出一个错误,因为没有with方法。


1
我会尝试的第一件事是 it { should validate_presence_of(:accepted_terms_at, :message => 'your message') },但我不知道那是否有效,并且现在也没有测试的安装。 - Emily
@Emily - 我试过了,它给了我“参数数量错误(应为1个而不是2个)”。 - Nathan Long
顺便说一下,这更像是一个“本应该”的问题。 - tal
3个回答

47

太棒了!感谢你找到了那个。 - Nathan Long

0

你有两个选择。

首先,你可以只断言当条款未被接受时模型无效。

其次,通过定义自定义错误消息来停止测试特定的错误消息:

https://dev59.com/zHRA5IYBdhLWcg3w1BmW#7108254

这样你就可以寻找错误信息的符号,而不是错误信息的文本。


0

冗长的方式

这个测试是有效的,只是不够简洁。

it "should validate the presence of accepted_terms_at" do
  @user.accepted_terms_at = nil
  @user.valid?
  message = "You must accept the Terms and Conditions to use this site."
  expect {@user.errors.messages.include?(message)}.to be_true
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接