如何测试named_scopes和搜索方法?

时间:2009-10-24 00:40:14

标签: ruby-on-rails unit-testing named-scope

当我了解proxy_options时,我开始使用它来测试我所有的命名范围。但后来我发现自己只是直接从模型中复制哈希条件,所以它并没有真正测试结果的正确性:

  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

但是如果结果以不同于您提供的顺序返回,则测试可能会失败。我想你可以实现&lt; =&gt;在您的模型中,您可以对两个数组进行排序。但似乎这不应该是必要的。有没有更好的方法来测试这些搜索方法?或者至少是一种普遍接受的正确方式?

1 个答案:

答案 0 :(得分:0)

我想我已经得出结论,没有“普遍接受的正确方法”来做到这一点。

我想我的个人解决方案是停止测试简单的named_scopes并使用assert包含?测试更复杂的搜索功能的方法。