2012-01-25 49 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的或早该解决方案尝试之前要先进的检测/匹配框架与基本坚持。

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

如果重点放在rails上,我会遵循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 expected,但没有提出任何问题。' – alenm

+0

是的,确切地说,如果验证缺失,你会得到一个错误 - 失败的测试是一个标志,你应该改变你的代码。现在是添加验证的时候了。 –