Я использую 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.