12

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

4

2 に答える 2

1

この問題は私もしばらくの間悩ませてきました!

Rails 2と動作が異なるのは、コントローラーでの変数の割り当て中にクエリが実行されなくなったためだと思います。代わりに、必要に応じて遅延読み込みされます。

私はMarkWildenに同意します。これらのスコープはすべて、モデル内のより大きなスコープと仕様でラップする方がよいということです。このスコープには明らかに特定の機能があるため、他のいくつかのメソッドを呼び出すメソッドの動作を指定するのと同じように、他のいくつかのスコープを結合するスコープの動作を指定します。

于 2011-05-21T23:24:49.137 に答える
0

このような複雑なクエリを独自のスコープでラップし、それをスタブします。

于 2011-04-23T06:14:09.957 に答える