2009-10-24 25 views
0

當我瞭解到proxy_options時,我開始使用它來測試所有命名的作用域。但後來我發現自己簡單地複製的條件從模型直散列,所以它並沒有真正測試結果的正確性:如何測試named_scopes和搜索方法?

po = {:conditions => "foo.created_at <= '#{Time.now.beginning_of_week}'"} 
    assert_equal po, Foo.created_this_week 

另一種方法是拿出正面和負面的例子,看看他們是否包括在結果還是不行:

this_week = Foo.make(:created_at => Time.now) 
    last_week = Foo.make(:created_at => 1.week.ago) 
    assert Foo.created_this_week.include?(this_week) 
    assert !Foo.created_this_week.include?(last_week) 

但這並不做檢查的界限,當事情變得更加複雜,你將有一個斷言包括整個一長串的好工作?現在看來,這將是更好拿出一組預期的結果,然後只檢查,以確保它符合:

Foo.make(:created_at => 1.week.ago) 
    results = [Foo.make(:created_at => Time.now)] 
    assert_equal results, Foo.created_this_week 

但隨後的測試可能會失敗,如果結果不同的順序比你供應返回。我想你可以在你的模型中實現< =>,這樣你可以對兩個數組進行排序。但似乎這不應該是必要的。有沒有更好的方法來測試這些搜索方法?或者至少是一個普遍接受的正確方法?

+0

我建議查看這個想法博客文章討論這個主題:http://robots.thoughtbot.com/post/200254501/testing-named-scopes – jonnii 2009-10-24 00:53:21

+0

感謝您的鏈接。看起來他的回答是:1)將命名範圍設爲私有,因此您不必測試它們; 2)使用數組相等方法來測試搜索方法並忽略排序的脆弱性。 – eremite 2009-10-26 16:08:08

+0

這幾乎是它的要義。這些幫助有用? – jonnii 2009-10-26 22:10:10

回答

0

我想我得出的結論是,沒有「普遍接受的正確方法」來做到這一點。

我想我的個人解決方案將停止測試簡單的named_scopes並使用assert includes?方法來測試更復雜的搜索功能。