2011-07-02 9 views
3

私はユーザー読書リスト(ユーザーhas_many読書リスト)のネストされたリソースを持っています。私はコントローラ仕様のすべてを模倣しようとしていますが、簡潔にするのは難しいです。ここでは#showアクションの前のコードです:RSpecとRailsで入れ子にされたリソースをどうやって処理するのですか?

@reading_lists = mock("Reading lists") 
@reading_lists.stub!(:find).with("1").and_return(@reading_list) 
@user = mock_model(User, :reading_lists => @reading_lists) 
User.stub!(:find).with("1").and_return(@user) 
get :show, :user_id => "1", :id => "1" 

でテスト:

def show 
    @user = User.find(params[:user_id]) 
    @reading_list = @user.reading_lists.find params[:id] 
end 

これは定型の狂った量のように思える - それを模擬するためのより良い方法はありますか?

+0

Factory.stubを使用する必要があります – apneadiving

答えて

4

これを模擬するより良い方法はありませんが、これはボイラープレートが多いことに気づくのは間違いありません。その理由は、user.reading_lists.findがDemeter違反の法則であるためです。 Demeterの法則を重要視しているかどうかにかかわらず、違反行為を嘲笑することは苦痛です。

実際のモデルを使用するか、モデルとのやりとりを簡略化することをおすすめします。私はあなたが何を指定しようとしているのか見ていないとどうして言うことはできません。

+0

こんにちはデービッド、あなたの答えに感謝します。はい、私はデメテルの法則に関してそれについては考えていませんでしたが、あなたは絶対に正しいです。私が指定しようとしているのは、2番目のコードサンプルです。User.findを実行するのではなく、指定したUserに所属するReadingListを探したいだけです。とにかく、私はあなたが正しいと思う - 私はちょうどすべてのスタブをカットし、実際のモデルと一緒に行くでしょう。乾杯! – Skilldrick

+0

これについて考えると、私は 'user.find_reading_list'のために行くと思います。 AR関連があるモデルにそのようなメソッドを追加するプラグインを作成するかもしれません。 – Skilldrick

関連する問題