19

コントローラー仕様で ajax リクエストをテストしたいだけです。プロダクトコードは以下です。認証にはDeviseを使用しています。

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 になるはずですが、401 が返されます。おそらく、rspec がスローするリクエストに Authenticity_token などがないためだと思います。どうすればそれをスタブできますか?

どんな助けでも大歓迎です。

4

3 に答える 3

37

私自身の質問に答えます。それformat: :jsonは間違っていることがわかりました。削除するだけで機能します。以下のように:

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

お騒がせしてすみません。

于 2012-06-21T09:30:20.187 に答える
0

format: :json を params ハッシュに移動したところ、正常に動作し、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
于 2012-07-26T08:15:50.133 に答える
-4

CSRFエラーが発生した可能性があります。たとえば、ajax呼び出しのCSRF検証を無効にしてみてください。

# In your application_controller.rb
def verified_request?
  if request.xhr?
    true
  else
    super()
  end
end
于 2012-06-20T11:41:01.630 に答える