Подтвердить что ты не робот

Rails 3, RSpec 2.5: Использование should_receive или stub_chain с именованными областями

Я использую Rails 3.0.4 и RSpec 2.5. В моих контроллерах я сильно использую имена областей, например

   @collection = GuestbookEntry.nonreplies.bydate.inclusive.paginate(
       :page => params[:page], :conditions => { ... })

В моих тестах я хочу быть в состоянии высмеять результат такого запроса, а не формулировку. Я не думаю, что имеет смысл делать что-то вроде

   GuestbookEntry.stub_chain(:nonreplies, :bydate, ...).and_return(...)

потому что этот тест завершится неудачно, когда я решит изменить порядок имен в названных областях.

С Rails 2.3 и RSpec 1.x это сработало нормально: я мог написать

   GuestbookEntry.should_receive(:find).with(:all, :conditions => { ... })

и вышеупомянутый вызов будет пойман и правильно обработан. Однако с Rails 3 по какой-то причине это больше не работает.

Почему? Как установить ожидания или заглушки в результате вложенных областей? Поскольку все в Rails 3 ActiveModel является именованной областью (благодаря AREL), это должно быть возможно каким-то образом, или тесты действительно будут очень хрупкими.

Спасибо!

Обновление: См. также отчет о проблеме на GitHub.

4b9b3361

Ответ 1

Эта проблема слишком долго меня беспокоила!

Я считаю, что поведение отличается от Rails 2, потому что запрос больше не выполняется во время назначения переменной в контроллере. Вместо этого он лениво загружается по мере необходимости.

Я согласен с Марком Уайденом в том, что лучше всего обернуть все эти области в более широком диапазоне и специфицировать это в вашей модели. Эта область видимости явно имеет определенную функцию, поэтому, как можно было бы определить поведение метода, который вызывает несколько других методов, вы бы указали на поведение области, которая объединяет несколько других областей.

Ответ 2

Я бы обернул такой сложный запрос в своей области и закрою это.