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
但隨後的測試可能會失敗,如果結果不同的順序比你供應返回。我想你可以在你的模型中實現< =>,這樣你可以對兩個數組進行排序。但似乎這不應該是必要的。有沒有更好的方法來測試這些搜索方法?或者至少是一個普遍接受的正確方法?
我建議查看這個想法博客文章討論這個主題:http://robots.thoughtbot.com/post/200254501/testing-named-scopes – jonnii 2009-10-24 00:53:21
感謝您的鏈接。看起來他的回答是:1)將命名範圍設爲私有,因此您不必測試它們; 2)使用數組相等方法來測試搜索方法並忽略排序的脆弱性。 – eremite 2009-10-26 16:08:08
這幾乎是它的要義。這些幫助有用? – jonnii 2009-10-26 22:10:10