Когда я узнал о 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
Но тогда проверка может завершиться неудачей, если результаты будут возвращены в другом порядке, чем вы указали. Я думаю, вы могли бы реализовать <=> в вашей модели, чтобы вы могли отсортировать оба массива. Но похоже, что это не должно быть необходимым. Есть ли лучший способ проверить эти методы поиска? Или хотя бы общепринятый правильный путь?