Как проверить named_scopes и методы поиска?
-
06-07-2019 - |
Вопрос
Когда я узнал о 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; в вашей модели, чтобы вы могли отсортировать оба массива. Но похоже, что это не должно быть необходимым. Есть ли лучший способ проверить эти методы поиска? Или, по крайней мере, общепринятый правильный путь?
Решение
Я думаю, что пришел к выводу, что & общепринятого правильного пути не существует "!" сделать это.
Полагаю, мое личное решение - прекратить тестирование простых named_scopes и использовать assert include? метод для тестирования более сложной поисковой функциональности.