Модульное тестирование Как провалить тест для проверки формата URL - PullRequest
3 голосов
/ 25 января 2012

У меня есть модель, которая требует допустимого формата URL.

class Event < ActiveRecord::Base

  validates_format_of :url, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix

end

НО ДО реализации решения Я хочу написать тест, который не проходит. Это как кто-то может написать о неудачном тесте? (Пожалуйста, не пытайтесь придерживаться основ Rspec или Always, прежде чем переходить к расширенным средам тестирования / сопоставления.

class EventTest < ActiveSupport::TestCase

setup do
# These attributes are valid
@event_attributes = { :title => "A title",
                      :url => "http://somedomain.com/images/land.jpg",}
end

test "should not be valid with an INVALID URL" do
    @event = Event.new(@event_attributes.merge(:url => "htp:/domain"))
    assert_no_match(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix, @event.url, "Not a valid format")   
  end

end

Является ли assert_no_match правильным подходом. Любые предложения.

1 Ответ

2 голосов
/ 26 января 2012

Это неправильный подход, потому что вы вообще не тестируете проверку Event. Вместо этого общий шаблон заключается в создании объекта с атрибутом, который будет вызывать ошибку проверки и утверждать, что возникла исключительная ситуация проверки. Итак, в вашем случае:

assert_raise(ActiveRecord::RecordInvalid) do
  @event = Event.create!(@event_attributes.merge(:url => "htp:/domain"))
end

Rspec - это хорошо, поэтому вы должны попробовать его в какой-то момент, и я думаю, что лучше раньше, чем позже. Также есть хорошая библиотека для шаблона @event_attributes.merge, который вы использовали: она называется factory_girl . Проверьте это, это избавит вас от неприятностей.

...