2013-05-08 9 views
5

In Michael Hartl's Rails Tutorial (Rails 3.2), nel Listato 9.52:Rails: Elimina la richiesta in capibara, bug o errore mio?

 describe "when signing in again" do 
     before do 
      delete signout_path 
      print page.html <---- Insert this here 
      visit signin_path 
      print page.html <---- Insert here again 
      fill_in "Email", with: user.email 
      fill_in "Password", with: user.password 
      click_button "Sign in" 
     end 

     it "should render the default (profile) page" do 
      page.should have_selector('title', text: user.name) 
     end 
     end 

Ho inserito queste due stampe. E, sorprendentemente, ho ottenuto la stampa della stessa pagina (che non dovrebbe essere, Dovevo riportarti all'URL di root dopo aver inviato la richiesta DELETE). Dopo ciò, dal momento che visit signin_path mi riporta alla pagina di accesso, la procedura di accesso ha esito positivo e lo stesso vale per il caso di test. Tuttavia, il secondo print page.html mi ha fornito l'intestazione di un utente che è ancora connesso.

Quando ho cambiato delete signout_path in click_link "Sign out", ha funzionato.

Ho perso qualcosa nel mio codice o si tratta di un bug Capybara? (Causa Sono abbastanza sicuro che ho seguito tutto giusto ..)

UPDATE: Se cambio delete signout_path-Capybara.current_session.driver.delete signout_path funziona anche bene. (Significato segni Capybara fuori l'utente correttamente)

UPDATE

Questi sono i file (sessioni del controller e di supporto):

sessions_controller.rb

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_email(params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_back_or user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 

end 

sessions_helper.rb

module SessionsHelper 
    def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    def signed_in_user 
    unless signed_in? 
     store_location 
     redirect_to signin_url, notice: "Please sign in." 
    end 
    end 

    def current_user 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
    end 

    def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 

    def redirect_back_or(default) 
    redirect_to(session[:return_to] || default) 
    session.delete(:return_to) 
    end 

    def store_location 
    session[:return_to] = request.url 
    end 
end 

routes.rb

DemoApp::Application.routes.draw do 
    ... 

    root to: 'static_pages#home' 

    match '/signup', to: 'users#new' 
    match '/signin', to: 'sessions#new' 
    match '/signout', to: 'sessions#destroy', via: :delete 

    resources :sessions, only: [:new, :create, :destroy] 

    ... 

end 
+0

il codice per 'authentication_pages_spec.rb' sembra corretto. Puoi mostrare il controller e instradare i file? – halmeetdave

+0

@halmeetdave Ho appena aggiornato la domanda – ardiyu07

+0

Il tuo codice sembra buono. Potresti aver trovato un bug in Capybara. Sono troppo nuovo per Rails per confermare o negare questo però. – halmeetdave

risposta

3

delete signout_path non funziona su Capybara funzionalità specifiche. get, post, put, delete sono metodi specifici delle specifiche del controller e non sono disponibili nelle specifiche delle funzioni.

Si desidera anche effettuare richieste effettive (tramite clic, invia, ecc.) Nelle specifiche di Capybara poiché generalmente si tratta di ciò che si sta tentando di testare.

Se si desidera garantire che una sessione sia chiara come "impostazione", è meglio farlo tramite il modello.

Per inciso, se si guarda ciò che si sta descrivendo "al momento dell'accesso di nuovo", probabilmente si desidera "disconnettersi" in modo da poter effettivamente "accedere di nuovo".

+0

Stai dicendo che il metodo 'delete' (o' Capybara.current_session.driver.delete') non dovrebbe essere lì in primo luogo? – ardiyu07

+0

Bene, non è prassi generale utilizzare questi metodi per un test del tipo di funzionalità/accettazione. Vuoi utilizzare lo stack completo per scorrere i tuoi scenari. – nowk

+0

Il metodo 'delete' è in realtà un metodo in' Rack :: Test', e avvia una sessione diversa dalla sessione Capybara. [Ecco un articolo che lo spiega] (http://www.elabs.se/blog/34-capybara-and-testing-apis). – carols10cents

2

Si può provare seguenti:

page.driver.submit :delete, '/users/sign_out', {} 
Problemi correlati