2012-06-20 4 views
19

컨트롤러 사양에 대한 AJAX 요청을 테스트하고 싶습니다. 제품 코드는 다음과 같습니다. 저는 Devise를 인증에 사용하고 있습니다.RSpec으로 ajax POST 요청을 테스트하려면 어떻게해야합니까?

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이 될 것으로 예상하지만, 내가 RSpec에 던졌습니다 요청이 authenticity_token 또는 뭔가 부족하기 때문에이 있어야합니다 생각 (401) 반환합니다. 내가 어떻게 찌를 수 있니?

도움을 주시면 감사하겠습니다.

답변

-3

당신은 아마 만난 CSRF 오류, 내 자신의 질문에 대답, 아약스 호출에 CSRF 유효성 검사를 사용하지

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

감사합니다. 나는이 팁을 시도했지만 아무런 변화도주지 않았다. 그리고 나는 csrf가 약간의 불안정한 설정을하는 것을 느낀다. – morygonzalez

+11

-1 CSRF 보호를 사용하지 않도록 설정하면이 문제를 해결할 수 없습니다. –

35

같은 것을보십시오. 나는 format: :json가 잘못되었음을 발견했다. 그냥 삭제하면됩니다. 아래처럼 :

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

모든 일로 유감스럽게 생각합니다.

+1

이것이 가장 우아한 해결책이라고 생각합니다. 요청이 일반 xhr 인 경우'format : json'을 사용하는 것을 좋아하지 않습니다. – thekingoftruth

+0

네 이것이 가장 좋은 해결책이다. –

+8

참고 : 레일스 5 이상에서 rspec이 사용되지 않는 형식은 다음과 같다 :'post : create, xhr : true, params : {note : {title : "foo", body : " bar "}}'. 이후 버전에서는 키워드 params가 필요하며'xhr' 메소드는 제거 될 것입니다. –

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 
관련 문제