Rails утверждает, что форма действительна - PullRequest
0 голосов
/ 26 июня 2009

Каков наилучший метод проверки работоспособности модели в рельсах?

Например, если у меня есть модель User, которая проверяет уникальность свойства email_address, как я могу проверить, что отправка формы вернула ошибку (или, что еще лучше, специально вернула ошибку для этого поля).

Я чувствую, что это должно быть что-то очевидное, но, как я быстро выясняю, у меня все еще не хватает словарного запаса, необходимого для эффективного поиска рубиновых вопросов Google.

Ответы [ 4 ]

2 голосов
/ 27 июня 2009

errors.on это то, что вы хотите

http://api.rubyonrails.org/classes/ActiveRecord/Errors.html#M002496

@obj.errors.on (: email) вернет nil, если поле является действительным, и сообщения об ошибках либо в строке, либо в массиве строк, если есть одна или несколько ошибок.

2 голосов
/ 26 июня 2009

Самый простой способ, вероятно, будет:

class UserEmailAddressDuplicateTest < ActiveSupport::TestCase
  def setup
    @email = "test@example.org"
    @user1, @user2 = User.create(:email => @email), User.new(:email => @email)
  end

  def test_user_should_not_be_valid_given_duplicate_email_addresses
    assert !@user2.valid?
  end

  def test_user_should_produce_error_for_duplicate_email_address
    # Test for the default error message.
    assert_equal "has already been taken", @user2.errors.on(:email)
  end
end

Конечно, возможно, что вы не хотите создавать отдельный тестовый пример для этого поведения, и в этом случае вы можете продублировать логику в методе настройки и включить ее в оба теста (или поместить в приватный метод) .

В качестве альтернативы вы можете сохранить первого (эталонного) пользователя в приборе, например fixtures/users.yml, и просто создать нового пользователя с дублирующимся адресом в каждом тесте.

Рефакторинг по вашему усмотрению!

2 голосов
/ 26 июня 2009

http://thoughtbot.com/projects/shoulda/

Следует, чтобы макрос включал в себя макросы для тестирования таких вещей, как валидаторы, и многое другое. Стоит проверить на TDD.

1 голос
/ 27 июня 2009

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

Раздел 4 Руководства по тестированию Rails содержит много полезной информации о функциональном тестировании (то есть тестировании контроллеров и представлений). Здесь у вас есть несколько основных опций: проверьте, есть ли во флэш-памяти сообщение об ошибке, или используйте assert_select, чтобы найти фактические элементы HTML, которые должны были быть сгенерированы в случае ошибки. Последний действительно единственный способ проверить, что пользователь действительно получит сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...