2012-06-20 16 views
19

コントローラー仕様でajax要求をテストしたいだけです。製品コードは以下の通りです。私はDeviseを認証に使用しています。RSpecでajax POSTリクエストをテストするにはどうすればよいですか?

class NotesController < ApplicationController 
    def create 
    if request.xhr? 
     @note = Note.new(params[:note]) 
     if @note.save 
     render json: { notice: "success" } 
     end 
    end 
    end 
end 

仕様は以下のとおりです。

describe NotesController do 
    before do 
    user = FactoryGirl.create(:user) 
    user.confirm! 
    sign_in user 
    end 

    it "has a 200 status code" do 
    xhr :post, :create, note: { title: "foo", body: "bar" }, format: :json 
    response.code.should == "200" 
    end 
end 

私は、応答コードが200であることを期待し、それは私がRSpecのスローリクエストがauthenticity_tokenか何かが欠けているので、それがなければなりません推測401を返します。どのように私はそれをスタブすることができますか?

任意の助けいただければ幸いです。

答えて

-3

おそらく会ったCSRFエラー、自分の質問に答える、AJAX呼び出しにCSRFの検証を無効にする

# In your application_controller.rb 
def verified_request? 
    if request.xhr? 
    true 
    else 
    super() 
    end 
end 
+0

ありがとうございます。私はこのヒントを試しましたが、それは何の変化もありませんでした。そして、私は少しでもcsrfがオフに確認することを不安に感じる。 – morygonzalez

+11

-1 CSRF保護を無効にすることは、この問題の解決策ではありません。 –

35

のようなものを試してみてください。私はformat: :jsonが間違っていたことがわかりました。ただそれを削除し、それは動作します。次のように:

it "has a 200 status code" do 
    xhr :post, :create, note: { title: "foo", body: "bar" } 
    response.code.should == "200" 
end 

大変申し訳ございません。

+1

これは最も洗練されたソリューションだと思います。リクエストがジェネリックxhrのときに 'format:json'を使うのは嫌です。 – thekingoftruth

+0

はいこれは最善の解決策です –

+8

注:Rails 5以降では、非推奨の形式は 'post:create、xhr:true、params:{note:{title:" foo "、body:"バー "}}'。将来のバージョンでは、キーワードparamsが必要になり、 'xhr'メソッドが削除されます。 –

0

私はformat::jsonをparams hashに移動し、jsonで応答するとうまく動作します。

describe NotesController do 
    before do 
    user = FactoryGirl.create(:user) 
    user.confirm! 
    sign_in user 
    end 

    it "has a 200 status code" do 
    xhr :post, :create, { note: { title: "foo", body: "bar" }, format: :json } 
    response.code.should == "200" 
    end 
end 
関連する問題