19

我只想在控制器规范上测试 ajax 请求。产品代码如下。我正在使用设计进行身份验证。

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 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
于 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 回答