Вопрос по rspec, xmlhttprequest, ruby-on-rails – Как проверить ajax POST-запрос с помощью RSpec?

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

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

Ваш Ответ

3   ответа
0

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

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

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

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

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

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

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

Похожие вопросы