2009-10-24 65 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?方法来测试更复杂的搜索功能。