Как протестировать пользовательские сообщения, возвращаемые проверкой моделей в Rails - PullRequest
1 голос
/ 14 ноября 2009

У меня есть эта проверка в моей модели пользователя.

validates_uniqueness_of :email, :case_sensitive => false,
              :message => "Some funky message that ive cleverly written"

В моих тестах я хочу убедиться, что, когда пользователь вводит двойной адрес электронной почты, мое сообщение точно отображается, но без необходимости дублировать строку ошибки сверху в моем тесте. Мне это не нравится, потому что я уверен, что сообщение изменится, когда я начну думать о копировании. Хранит ли rails эти сообщения об ошибках - что я могу назвать в своих тестах?

Я сделал общий тест

assert @error_messages[:taken] , user.errors.on(:email)

, но это передало бы любые другие ошибки, связанные с электронной почтой, я настроил проверки, чтобы поймать то есть неправильное форматирование, пустое и т. Д.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2009

В rspec,

it "should validate uniqueness of email" do
  existing_user = User.create!(:email => email)
  new_user = User.create!(:email => existing_user.email)
  new_user.should_not be_valid
  new_user.errors.on(:email).should include("Some funky message that ive cleverly written")
end
2 голосов
/ 14 ноября 2009

Я провел быструю проверку, и похоже, что сообщения об ошибках сортируются в том порядке, в котором вы написали свои операторы проверки в классе модели (сверху вниз).

Это означает, что вы можете найти сообщение об ошибке для первой проверки атрибута на первом месте в массиве ошибок:

user.errors.on(:email)[0]

Итак, если ваш класс модели пользователя содержит что-то вроде этого:

validates_presence_of   :email
validates_uniqueness_of :email, :case_sensitive => false, :message => "Some funky message that ive cleverly written"
validates_length_of     :email

... вы найдете ваше «забавное сообщение» на user.errors.on(:email)[1], но только , если хотя бы validates_presence_of также вызовет ошибку.

По поводу вашей конкретной проблемы: Единственный способ, которым я мог придумать , а не , повторить ваше сообщение об ошибке в тесте, это определить константу в вашей пользовательской модели и использовать ее вместо непосредственного ввода сообщения для проверки:

EMAIL_UNIQUENESS_ERROR_MESSAGE = "Some funky message that ive cleverly written"
...
validates_uniqueness_of :email, :case_sensitive => false, :message => EMAIL_UNIQUENESS_ERROR_MESSAGE

В своем тесте вы также можете использовать эту константу:

assert_equal User::EMAIL_UNIQUENESS_ERROR_MESSAGE, user.errors.on(:email)[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...