2012-06-20 22 views
19

Po prostu chcę przetestować żądanie ajax na specyfikacji kontrolera. Kod produktu znajduje się poniżej. Używam Devise do uwierzytelniania.Jak przetestować żądanie ajax POST z 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 

Spec jest poniżej.

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 

Spodziewam kod odpowiedzi być 200, ale zwraca 401. Chyba musi to oznaczać, że wniosek, który rzuca rspec brakuje authenticity_token czy coś. Jak mogę go zamknąć?

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

-3

Pewnie spotkał błąd CSRF, spróbuj wyłączyć sprawdzanie CSRF dla wywołań Ajax coś podobnego

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

Dzięki. Wypróbowałem tę wskazówkę, ale nic nie zmieniło. I czuję się trochę nieswojo ustawienie csrf sprawdzić przy okazji przy okazji. – morygonzalez

+11

-1 wyłączenie ochrony CSRF NIE jest rozwiązaniem tego problemu. –

35

Odpowiadając na moje własne pytanie. Stwierdziłem, że format: :json było nieprawidłowe. Po prostu go usuń i działa. Tak jak poniżej:

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

Przepraszam za całe zamieszanie.

+1

Myślę, że to najbardziej eleganckie rozwiązanie. Nie lubię używać 'format: json' kiedy żądanie jest ogólne xhr. – thekingoftruth

+0

tak, to jest najlepsze rozwiązanie –

+8

Uwaga: z Rails 5 i nowszym rspec, niezaakceptowaną formą tego byłoby: 'post: create, xhr: true, params: {note: {title:" foo ", body:" pasek "}}'. W przyszłych wersjach wymagane będą parametry słów kluczowych, a metoda 'xhr' zostanie usunięta. –

0

Przeniosłem format:: json do skrótu params i działa dobrze, odpowiadając na 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 
Powiązane problemy