单元测试如何验证测试验证URL的格式

时间:2012-01-25 19:44:57

标签: ruby-on-rails ruby validation unit-testing

我有一个需要有效格式的网址的模型。

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是否正确。任何建议。

1 个答案:

答案 0 :(得分:2)

这不是正确的方法,因为您根本没有测试Event验证。相反,常见的模式是创建一个具有属性的对象,该属性将触发验证错误并断言已引发验证异常。所以,在你的情况下:

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

Rspec是好的,所以你应该在某个时候尝试,并且我认为早于晚些时候。还有一个很好的库,用于您使用的@event_attributes.merge模式:它被称为factory_girl。看看它,它会省去一些麻烦。