2012-01-25 2 views
3

У меня есть модель, которая требует действительного формата URL-адреса.Тестирование модуля Как сбой теста для проверки формата 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 или Shoulda не пытается придерживаться основ, прежде чем в передовых рамках тестирования/Сличитель.

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 правильный подход. Любые предложения.

+0

Если вы сосредоточены на рельсах, я бы рекомендовал рекомендовать hartl использовать комбинацию rspec (которая более читаема imho) и rubular для проверки соответствия URL-адресов. Я не знаю о TestCase, но вы, кажется, на правильном пути, хотя вы можете попробовать еще несколько неудачных примеров против регулярного выражения. – prusswan

+0

Хорошо, может быть, мне нужно прыгнуть в RSpec, часть меня думает, что мне нужно выставить ее и, возможно, попробовать MiniTest. Я не знаю, что проверю этот учебник, о котором вы упомянули. Спасибо – alenm

+1

В стороне, я не думаю, что вы должны использовать регулярное выражение для проверки URL-адреса вообще. Используйте обратный вызов 'before_validation' вместе с' URI.parse', чтобы его очистить (вычеркните userinfo, добавьте схему, если она не указана, ...), а затем снова URI.parse для проверки, чтобы убедиться компоненты URL - это то, что вы хотите. –

ответ

2

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

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

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

+0

Спасибо за разъяснение. Ваш не первый, кто скажет мне, чтобы я прыгнул на Rspec. Наверное, я пытаюсь сделать что-то медленнее, прежде чем прыгать с корабля. Ваше решение в порядке, но когда я запускаю тест, я получаю следующее сообщение: «ActiveRecord :: RecordInvalid ожидается, но ничего не было поднято». – alenm

+0

Да, точно, если проверка отсутствует, вы получаете сообщение об ошибке - неудачный тест - это знак, который вы должны измените свой код. Настало время добавить проверку. –

Смежные вопросы