2012-06-20 12 views
19

Voglio solo testare una richiesta Ajax sulle specifiche del controller. Il codice prodotto è sotto Sto usando Devise per l'autenticazione.Come si esegue il test della richiesta 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 

E le specifiche sono riportate di seguito.

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 

mi aspetto che il codice di risposta per essere 200, ma restituisce 401. Credo che deve essere perché la richiesta che RSpec getta manca authenticity_token o qualcosa del genere. Come posso mozzarlo?

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

-3

Probabilmente avete incontrato errore CSRF, provare a disattivare la convalida CSRF per le chiamate Ajax, qualcosa come

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

Grazie. Ho provato questo suggerimento ma non ha apportato alcuna modifica. E mi sento poco a disagio, e csrf si verifica a proposito. – morygonzalez

+11

-1 la disattivazione della protezione CSRF NON è una soluzione a questo problema. –

35

Rispondendo alla mia domanda. Ho trovato che format: :json era sbagliato. Basta cancellarlo e funziona. Proprio come di seguito:

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

Mi dispiace per tutte le storie.

+1

Penso che questa sia la soluzione più elegante. Non mi piace usare 'format: json' quando la richiesta è una xhr generica. – thekingoftruth

+0

sì, questa è la soluzione migliore –

+8

Nota: con Rails 5 e più recenti rspec, la forma non deprecata di questo sarebbe: 'post: create, xhr: true, params: {note: {title:" foo ", body:" bar "}}'. Nelle versioni future, saranno richiesti i parametri della parola chiave e il metodo 'xhr' verrà rimosso. –

0

Ho spostato il formato:: json in hash params e funziona bene, rispondendo 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 
Problemi correlati