Как проверить ajax POST-запрос с помощью RSpec?

Я просто хочу проверить запрос 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 или что-то в этом роде. Как я могу заглушить это?

Любая помощь будет принята с благодарностью.

Ответы на вопрос(3)

Возможно, вы встретили ошибку CSRF, попробуйте отключить проверку CSRF для вызовов ajax, что-то вроде

# In your application_controller.rb
def verified_request?
  if request.xhr?
    true
  else
    super()
  end
end
 07 авг. 2013 г., 10:38
-1 отключение защиты CSRF НЕ является решением этой проблемы.
 morygonzalez21 июн. 2012 г., 02:41
Благодарю. Я попробовал этот совет, но он ничего не изменил. И мне немного неловко, настройка csrf проверена кстати.

Я переместил формат:: 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

Отвечая на мой собственный вопрос. я нашел этоformat: :json был неправ. Просто удалите это, и это работает. Как показано ниже:

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

Я прошу прощения за всю эту суету.

 18 авг. 2016 г., 05:34
Примечание: с Rails 5 и более новой версией rspec, не осуждаемая форма этого будет:post :create, xhr: true, params: { note: { title: "foo", body: "bar" } }, В будущих версиях будут необходимы ключевые слова params иxhr метод будет удален.
 26 февр. 2014 г., 04:07
да это лучшее решение
 26 окт. 2012 г., 10:47
Я думаю, что это самое элегантное решение. Я не люблю пользоватьсяformat: json когда запрос является общим xhr.

Ваш ответ на вопрос