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

Это кажется немного странным, когда при запуске модульного теста, чтобы проверить, является ли длина моего заголовка> 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? Я должен утверждать, что что-то является действительным или недействительным, прежде чем я продолжу другие тесты? Что-то вроде инициализации теста?

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

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

3 голосов
/ 07 мая 2011

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

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

Я думаю, что может быть более естественным является использование метода «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

...