#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