4

RSpecを学習する手段として、作成しているアプリケーションのposts/show.html.erbビュー用に作成した仕様を貼り付けました私はまだモックとスタブについて学んでいます。この質問は、「関連するすべてのコメントをリストする必要がある」仕様に固有のものです。

私が欲しいのは、ショービューに投稿のコメントが表示されることをテストすることです。しかし、私がよくわからないのは、このテストをセットアップしてから、should contains('xyz')ステートメントを使用してテストを反復処理する方法です。ヒントはありますか?他の提案も大歓迎です!ありがとう。

- -編集

いくつかの詳細情報。私のビューのコメントにnamed_scopeを適用しているので(この場合は少し逆にした)、@ post.comments.authorized_is(true)。貼り付けられたコードは、「#の未定義のメソッド `authorized_is'」というエラーで応答します。これは、スタブコメントを指定してコメントを返すため、意味があります。ただし、@ post.comments.authorized_is(true)がコメントの配列を返すようにスタブをチェーンする方法はまだわかりません。

4

4 に答える 4

4

スタブは本当にここに行く方法です。

私の意見では、コントローラーとビューの仕様のすべてのオブジェクトは、モックオブジェクトでスタブ化する必要があります。モデル仕様ですでに徹底的にテストされているはずのロジックを冗長にテストするために時間を費やす必要はありません。

これがあなたのパスティでスペックを設定する方法の例です…</p>

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
于 2009-08-11T23:17:16.947 に答える
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")

終わり

于 2009-08-03T05:50:46.950 に答える
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である可能性があります。そして、保留中は同様に明白なことをするでしょう。

次のような:pending_commentのファクトリを作成することもできます。

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

または、falseがデフォルトの場合、:authorized_commentsに対して同じことを行うことができます。

于 2009-08-04T01:21:50.313 に答える
0

私はニックのアプローチが本当に好きです。私自身も同じ問題を抱えていて、次のことができました。mock_modelも機能すると思います。

post = stub_model(Post)
assigns[:post] = post
post.stub!(:comments).and_return([stub_model(Comment)])
于 2011-03-18T16:09:30.573 に答える