Как я могу использовать `should validate_presence_of` с пользовательским сообщением об ошибке? - PullRequest
25 голосов
/ 08 декабря 2011

Я тестирую свои модели ActiveRecord с помощью Rspec. Я только что добавил пользовательское сообщение об ошибке в одну из моих проверок, например:

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) }

... с ошибкой Expected errors to include "can't be blank" when accepted_terms_at is set to 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 метода.

Ответы [ 3 ]

40 голосов
/ 18 января 2012

В стандартную комплектацию входит:

it { should validate_presence_of(:name).
            with_message(/is not optional/) }

http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveModel:validate_presence_of

0 голосов
/ 08 декабря 2011

У вас есть два варианта.

Во-первых, вы можете согласиться с утверждением, что модель недействительна, если условия не были приняты.

Во-вторых, прекратите тестирование определенных сообщений об ошибках, указав собственное сообщение об ошибке:

https://stackoverflow.com/a/7108254/162793

Тогда вы можете искать символ сообщения об ошибке, а не текст сообщения об ошибке.

0 голосов
/ 08 декабря 2011

Verbose Way

Этот тест работает, он не такой лаконичный, как хотелось бы.

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
...