Rails: Test :: Unit Почему мне нужно утверждать, является ли что-то действительным или недействительным, перед любыми другими утверждениями

#ruby-on-rails #assert

#ruby-on-rails #утверждать

Вопрос:

Это кажется немного странным, при запуске модульного теста, чтобы проверить, равна ли длина моего заголовка > 10, мой тест пройдет, если я включу «assert product.invalid?» перед любым другим моим утверждением, подобным этому:

 require 'test_helper'

class ProductTest < ActiveSupport::TestCase

test "product title is too short" do
    product = Product.new(:title => "My lady",
                          :description => "yyy",
                          :price       => 1
                         )
    assert product.invalid?
    assert_equal "must be atleast 10 characters long.", product.errors[:title].join('; ')
end
end
  

Однако, если я не включу «assert product.invalid?» перед assert_equal я получаю эту ошибку
1) Сбой: test_product_title_is_too_short бла-бла-бла
(«должно быть не менее 10 символов».) ожидалось, но было («»).

Так работает Test:: Unit? Я должен утверждать, что что-то является действительным или недействительным, прежде чем приступить к другим тестам? Что-то вроде инициализации теста?

Ответ №1:

На самом деле это не характеристика вашей тестовой платформы, а скорее ActiveRecord.

При создании объекта с помощью ActiveRecord вы можете назначить проверки, чтобы убедиться в определенных атрибутах объектов (как у вас на вашем объекте). Однако эти проверки выполняются только в определенное время, и, как вы заметили, метод ‘new’ не относится к числу таких случаев. Однако, спрашивая о действительности объекта с недопустимым? метод, таким образом, вы запустили проверки.

Я думаю, что было бы более естественным использовать метод «create» вместо «new» для запуска проверок для вашего объекта. автоматически создавайте проверки, которые исключат ваш вызов «недействительный»? в вашем тесте и все равно следует заполнить хэш ошибок по желанию:

 product = Product.create(:title => "My lady",
                      :description => "yyy",
                      :price       => 1
                     )
assert_equal "must be atleast 10 characters long.", product.errors[:title].join('; ')
  

Аналогично методу ‘create’ является метод ‘create!’, который фактически вызовет исключение, если какие-либо проверки завершатся неудачей. create просто вернет false и заполнит хэш ошибки.

Для получения дополнительной информации о проверках ознакомьтесь:http://guides.rubyonrails.org/active_record_validations_callbacks.html

Комментарии:

1. Если он использует rails 3, технически это функциональность ActiveModel, которую ActiveRecord включает в себя: p Но да.

Ответ №2:

Это не имеет ничего общего с Test:: Unit. Это функциональность rails. Проверки выполняются только при вызове любой .valid? или одной из версий .save . Вы можете прочитать больше о цепочке обратного вызова здесь: http://guides.rubyonrails.org/active_record_validations_callbacks.html#when-does-validation-happen