2012-07-08 23 views
5

私はRailsのスキルを向上させるためにYahoo Answersのアプリを開発しています。 これまでのところ、私が設定した2機種「質問」と「回答」と、彼らはこのようにネストされていますRspecとRailsとテストテストとネストされたリソース

resources :questions do 
    resources :answers 
    end 

私は、コントローラ、モデルや質問の見解のためのテストを行ったが、私はよ答えの視点や入れ子になったルートには少し問題があります。私はRspecと工場の女の子を使っています。

私は次のテストがあります

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)>' 

お願いします。私は今、まったく無知です。

答えて

8

私はあなたの意見に誤りがあると思います。あなたはそれを追加できますか?

また、ここではRSpecのを使用して上のいくつかのアドバイスです:

  • あなたはLETブロックに@question@answerの両方を入れることができます。最近はそれを行うのが好ましい方法です。ドキュメントをチェックしてください。使用するのはかなり簡単です。
  • ではなく、FactoryGirl.createを実際に使用する必要があります。 RSpec設定にFactory::Syntax::Methodsを含める場合は、createに短縮することができます。
  • テストダブルと実際のモデルを混在させることは、一般的には良い考えではありません。モデルからビューを切り離すか、すべての方法で統合するか、をAnswer.buildに置き換えるか、@question@answerのスタブを使用する必要があります。 FactoryGirlはFactory.build_stubbedです。これは基本的にはビュー仕様に適したstub_modelです。
  • 仕様を表示するには猶予が足りません。 RSpecのメーリングリストを検索して、人々がなぜそれらを避けようとしたのかについての詳細を調べることをお勧めします。私の考えは、モデルやヘルパーに依存しているため、かなり壊れやすく(コードを変更すると壊れやすい)ことです。彼らはあなたに多くのスタブをつけたり、モデルを統合したり、シンプルなプレゼンターを書いたりしなければなりません。それは彼らの用途があると言われていますが、まれです。より良い選択肢は、キュウリ、ステーキまたは単にrspecとカピバラを使用して、この相互作用を統合でテストすることです。
  • アサーションは、通常、ビュー仕様でテストしたくないものの例です。フォームフィールドが含まれていることを主張しています。フォームフィールドはフォーム自体が存在するが、動作していないことを示すため、良いテストではありません。あなたは統合のより良いカバレッジを得るでしょう。また、脆弱ではありません。たとえば、モデルやフィールドの名前を変更すると、ビューの仕様を変更する必要はありません。
2

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

私のケースでは、これはレールパスの助けの1つ、例えばanswers_path(@question)のようなものを呼び出すことによって引き起こされましたが、それはnilになりました。

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

関連する問題