5

Rails のスキルを向上させるために、Yahoo Answers のようなアプリに取り組んでいます。これまでのところ、「Question」と「Answers」の 2 つのモデルを設定しましたが、これらは次のようにネストされています。

  resources :questions do
    resources :answers
  end

コントローラー、モデル、および質問のビューのテストを作成しましたが、回答のビューとネストされたルートに少し問題があります。私は Rspec と Factory girl を使用しています。

次のテストがあります。

describe "answers/new.html.erb" do
  before(:each) do
    @question = Factory(:valid_question)
    @answer = Factory(:valid_answer)
    assign(:question, @question)
    assign(:answer, stub_model(Answer,
      :text => "MyString",
      :question_id => 1
    ).as_new_record)
  end

  it "renders new answer form" do
    render
    assert_select "form", :action => question_answers_path(@question), :method => "post" do
      assert_select "textarea#answer_text", :name => "answer[text]"
      assert_select "input#answer_question_id", :name => "answer[question_id]"
    end
  end
end

テストを実行するたびに、次のメッセージが表示されます。

  3) answers/new.html.erb renders new answer form
     Failure/Error: render
     ActionView::Template::Error:
       No route matches {:controller=>"answers"}
     # ./app/views/answers/new.html.erb:6:in `_app_views_answers_new_html_erb__3175854877830910784_6513500'
     # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>'

私はやるように多くのことを試しました

render new_question_answer_path(@question)

しかし、私はこれを取得します:

  3) answers/new.html.erb renders new answer form
     Failure/Error: render new_question_answer_path(@question.id)#, :format=>:html
     ActionView::MissingTemplate:
       Missing partial /questions/1/answers/new with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :
url_encoded_form, :json], :locale=>[:en, :en]}. Searched in:
         * "/home/juan/rails_projects/answers/app/views"
     # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>'

これを手伝ってくれませんか?私は今、ちょっと無知です。

4

2 に答える 2

8

エラーはあなたの見解にあると思います。追加できますか?

また、RSpec の使用に関するアドバイスは次のとおりです。

  • と の両方@question@answerlet ブロックに入れることができます。最近では、これが推奨される方法です。ドキュメントを確認してください。使い方はかなり簡単です。
  • FactoryGirl.createではなく、実際に使用する必要がありFactory()ます。RSpec構成createに含める場合は、短縮できます。Factory::Syntax::Methods
  • 一般に、テスト ダブルと実際のモデルを混在させることはお勧めできません。stub_modelビューをモデルから分離するか、完全に統合する必要Answer.build@questionあり@answerます。FactoryGirlFactory.build_stubbedは基本的stub_modelにビュースペックに適しています。
  • ビューの仕様が崩れました。RSpec メーリング リストで、人々がそれらを避けることを選択する理由の詳細を検索することをお勧めします。モデルやヘルパーに依存しているため、かなり壊れやすい (コードを変更すると壊れやすい) というのが私の見解です。多くのスタブを作成するか、モデルを統合するか、単純なプレゼンターを作成する必要があります。そうは言っても、それらには用途がありますが、まれです。より良い代替手段は、キュウリ、ステーキ、または単に rspec とカピバラを使用して、統合でこの相互作用をテストすることです。
  • あなたのアサーションは、ビュー仕様で通常テストしたくないものの例です。フォームフィールドを含む何らかのマークアップの存在を主張していますが、フォームがそこにあることはわかりますが、機能していることはわからないため、それ自体は良いテストではありません。統合により、より良いカバレッジが得られます。また、壊れにくくなります。たとえば、モデルやフィールドの名前を変更した場合、ビューの仕様を変更する必要はありません。
于 2012-07-09T15:00:56.910 に答える
2

この問題に遭遇しました。スタック トレースをよく見ると、ビューが正しく呼び出されていることがわかりますが、6 行目にエラーがあります。

私の場合、これはレールパスヘルプの1つへの呼び出しによって引き起こされましたが、answers_path(@question)nilが渡されていました。

修正はassign、そのインスタンス変数の呼び出しを追加することです。:locals代わりにローカル変数を使用すると、を呼び出すときにハッシュを介して渡すことができますrender

于 2012-10-11T02:22:00.437 に答える