Rails 3, RSpec 2.5: использование should_receive или stub_chain с именованными областями действия - PullRequest
12 голосов
/ 09 марта 2011

Я использую 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 по какой-то причине это больше не работает.

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

Спасибо!

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

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Эта проблема меня тоже давно подвела!

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

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

0 голосов
/ 23 апреля 2011

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

...