2009-08-03 9 views
4

RSpecを学ぶ手段として書いているアプリケーションのposts/show.html.erbビュー用に書いた仕様はpastiedです。私はまだモックとスタブについて学んでいます。この質問は、「すべての関連するコメントをリストする」仕様に固有のものです。RSpecテストでモデル結合を設定するにはどうすればよいですか?

私が望むのは、表示ビューに投稿のコメントが表示されていることをテストすることです。しかし、私がよく分からないことは、このテストをどのようにセットアップしてから、テストの繰り返しを( 'xyz')ステートメントを含むべきかということです。何かヒント?その他の提案も感謝しています!ありがとう。

---編集

さらに詳しい情報私はnamed_scopeを私のビューのコメントに適用しています(私はこれを少し後でこのケースで行いました)ので、@ post.comments.approved_is(true)です。貼り付けられたコードは、 "未定義のメソッド` approved_is 'for# "のエラーで応答します。これは、スタブのコメントとコメントを返すので意味があります。しかし、@ post.comments.approved_is(true)がコメントの配列を返すように、スタブを連鎖する方法はまだ分かりません。

答えて

4

スタビングは本当にここに行く方法です。

私の意見では、コントローラとビューの仕様のすべてのオブジェクトはモックオブジェクトでスタブされるべきです。モデル仕様ですでに完全にテストされているロジックを重複してテストするために時間を費やす必要はありません。

ここで私は本当にニックのアプローチのような

describe "posts/show.html.erb" do 

    before(:each) do 
    assigns[:post] = mock_post 
    assigns[:comment] = mock_comment 
    mock_post.stub!(:comments).and_return([mock_comment]) 
    end 

    it "should display the title of the requested post" do 
    render "posts/show.html.erb" 
    response.should contain("This is my title") 
    end 

    # ... 

protected 

    def mock_post 
    @mock_post ||= mock_model(Post, { 
     :title => "This is my title", 
     :body => "This is my body", 
     :comments => [mock_comment] 
     # etc... 
    }) 
    end 

    def mock_comment 
    @mock_comment ||= mock_model(Comment) 
    end 

    def mock_new_comment 
    @mock_new_comment ||= mock_model(Comment, :null_object => true).as_new_record 
    end 

end 
1

これが最善の解決策であるかどうかはわかりませんが、named_scopeをスタブするだけで仕様を取得できました。私は、これに関するフィードバックと、よりよい解決策の提案をお待ちしております。

it "should list all related comments" do 
@post.stub!(:approved_is).and_return([Factory(:comment, {:body => 'Comment #1', :post_id => @post.id}), 
             Factory(:comment, {:body => 'Comment #2', :post_id => @post.id})]) 
render "posts/show.html.erb" 
response.should contain("Joe User says") 
response.should contain("Comment #1") 
response.should contain("Comment #2") 

エンド

0

それは少し厄介読み込みます。その旨を

it "shows only approved comments" do 
    comments << (1..3).map { Factory.create(:comment, :approved => true) } 
    pending_comment = Factory.create(:comment, :approved => false) 
    comments << pending_comments 
    @post.approved.should_not include(pending_comment) 
    @post.approved.length.should == 3 
end 

か何か:

あなたのような何かを行うことができます。仕様を振る舞い、承認されたメソッドは承認されたコメントを投稿に返すべきです。これは単純なメソッドまたはnamed_scopeになります。また保留中であれば、明らかなこともあるでしょう。 、

Factory.define :pending_comment, :parent => :comment do |p| 
    p.approved = false 
end 

またはfalseがデフォルトである場合は、あなたがのために同じことを行うことができます::pending_comment、のようなもの:

はまたのために工場を持っている可能性がありapproved_comments。

0

...私はあなたのPastieで仕様を設定する方法を例です。私も同じ問題を抱えていましたが、私は次のことをすることができました。私はmock_modelもうまくいくと信じています。

post = stub_model(Post) 
assigns[:post] = post 
post.stub!(:comments).and_return([stub_model(Comment)]) 
関連する問題