3

テストフレームワークにFactoryGirlとRspecを使用しています。validates_presence_of検証があるモデルがあります。基本的なRspecフレームワークには、次のテストが含まれています。

describe "with invalid params" do
  it "assigns a newly created but unsaved disease as @disease" do
    # Trigger the behavior that occurs when invalid params are submitted
    Disease.any_instance.stub(:save).and_return(false)
    post :create, :disease => {}
    assigns(:disease).should be_a_new(Disease)
  end
end

編集: diseases_controller.rb

 # POST /diseases
 # POST /diseases.xml
 def create
   @disease = Disease.new(disease_params)

   respond_to do |format|
     if @disease.save
       format.html { redirect_to(@disease, :notice => 'Disease was successfully created.') }
       format.xml  { render :xml => @disease, :status => :created, :location => @disease }
     else
       format.html { render :action => "new" }
       format.xml  { render :xml => @disease.errors, :status => :unprocessable_entity }
     end
   end
 end

 private
 def disease_params
   params.require(:disease).permit(:name, :omim_id, :description)
 end

このテストは、私のアプリケーションの動作では機能しません。間違った投稿で新しい病気を返すのではなく、エラーを返します。

Required parameter missing: disease

質問1:Rspecで返される内容を確認する方法がわかりません。このresponse場合、オブジェクトは作成されていないように見えますか?印刷assigns(:disease)には何も含まれていないようです。空のデータを含む正しいURLにcURL投稿を送信することで以前に投稿したエラーメッセージを受け取りました(これはrspect投稿が行うべきことです)が、Rspecが何を受信して​​いるかの情報を取得する方法がわかりませんポストステートメント。

質問2:必要なパラメーターが欠落していることを示すエラーメッセージを受信するという、発生するはずの応答を適切にテストするにはどうすればよいですか?

編集:私のコントローラーは、新しい病気を引き起こすはずだと示しているようですが、テストは失敗します。ウェブサイトで必要なパラメータが欠落している病気を提出しようとすると、「名前を空白にすることはできません」というフラッシュ通知が表示されます。rspecでそれをテストする方法がわかりません。

編集#2:上記のコードを含めました。strong_parametersdisease_paramsは、 gemの使用に関する推奨事項に従って、コントローラーの下部で定義されます。

ありがとう!

4

1 に答える 1

3

質問1に答えるには(「Rspecで返されるものを確認する方法がわかりません」)...仕様内(つまりitブロック内)で「puts」ステートメントを使用できます。たとえば、次のようなことを試すことができます。

describe "with invalid params" do
  it "assigns a newly created but unsaved disease as @disease" do
    # Trigger the behavior that occurs when invalid params are submitted
    Disease.any_instance.stub(:save).and_return(false)
    post :create, :disease => {}
    puts :disease
    assigns(:disease).should be_a_new(Disease)
  end
end

これは貴重なデバッグツールです。RSpecの実行中は、出力はターミナルの.sとFsになります。

質問2については、何を探しているのかよくわかりませんが、無効な病気が@diseaseとして割り当てられていることをテストする必要がある(またはすべきである)かどうかはわかりません。私はコントローラーの仕様を次のスタイルでパターン化する傾向があります(コントローラーの仕様の書き方を学んだRSpecを使用したEveryday Rails Testingから取得)。

POST作成仕様の例:

context "with invalid attributes" do
  it "does not save the new contact" do
    expect{
      post :create, contact: Factory.attributes_for(:invalid_contact)
    }.to_not change(Contact,:count)
  end

  it "re-renders the new method" do
    post :create, contact: Factory.attributes_for(:invalid_contact)
    response.should render_template :new
  end
end 
...

私が知らないコントローラーメソッドをより徹底的にテストする理由があるかもしれません。その場合は、質問2に対する私の答えを無視してください。うまくいけば、他の答えが役立つことを願っています。

于 2013-04-18T00:39:13.427 に答える