2012-01-25 34 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

是的,確切地說,如果驗證缺失,你會得到一個錯誤 - 失敗的測試是一個標誌,你應該改變你的代碼。現在是添加驗證的時候了。 –