2012-06-20 13 views
19

Solo quiero probar la solicitud de ajax en la especificación del controlador. El código de producto está debajo. Estoy usando Devise para la autenticación.¿Cómo pruebo la solicitud POST ajax con RSpec?

class NotesController < ApplicationController 
    def create 
    if request.xhr? 
     @note = Note.new(params[:note]) 
     if @note.save 
     render json: { notice: "success" } 
     end 
    end 
    end 
end 

Y las especificaciones están por debajo.

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 

lo esperado El código de respuesta para ser 200, pero vuelve 401. supongo que debe ser porque la solicitud que arroja rspec carece authenticity_token o algo así. ¿Cómo puedo cortarlo?

Cualquier ayuda sería muy apreciada.

Respuesta

-3

Es probable que haya conocido a error CSRF, tratar de desactivar la validación CSRF para las llamadas ajax, algo así como

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

Gracias. Intenté este consejo pero no hizo ningún cambio. Y por cierto, me siento un poco incómodo al ver csrf verificar. – morygonzalez

+11

-1 deshabilitar la protección CSRF NO es una solución a este problema. –

35

responder a mi propia pregunta. Encontré que format: :json estaba equivocado. Solo elimínalo y funciona. Al igual que a continuación:

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

Lo siento por todo el alboroto.

+1

Creo que esta es la solución más elegante. No me gusta usar 'format: json' cuando la solicitud es una xhr genérica. – thekingoftruth

+0

sí, esta es la mejor solución –

+8

Nota: con Rails 5 y rspec más reciente, la forma no objetada de esto sería: 'post: create, xhr: true, params: {nota: {título:" foo ", cuerpo:" bar "}}'. En versiones futuras, se requerirá la palabra clave params y se eliminará el método 'xhr'. –

0

He movido el formato:: json en params hash y funciona bien, respondiendo con 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