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 の問題レポートも参照してください。