Подтвердить что ты не робот

Как проверить запрос 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, не имеет аутентификации_token или чего-то еще. Как я могу его заглушить?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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