2013-05-08 21 views
5

In Michael Hartl's Rails Tutorial (Rails 3.2), in Listing 9.52:Schienen: Anfrage in Capybara, Bug oder mein Fehler löschen?

 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 

I eingefügt, diese beiden Drucke. Und, überraschenderweise habe ich den Ausdruck der gleichen Seite (was nicht sein sollte, sollte es Sie zurück auf die Root-URL nach dem Senden der DELETE Anfrage bringen). Nachdem dies passiert ist, da visit signin_path mich zurück auf die Anmeldeseite bringt, ist die Anmeldeprozedur erfolgreich und der Testfall ebenfalls erfolgreich. Aber die zweite print page.html gab mir die Kopfzeile eines Benutzers, der immer noch angemeldet ist.

Als ich delete signout_path zu click_link "Sign out" änderte, funktionierte es.

Habe ich etwas in meinem Code übersehen oder ist es ein Capybara-Käfer? (Weil ich ziemlich sicher bin, folgte ich alles richtig ..)

UPDATE: Wenn ich ändern delete signout_path-Capybara.current_session.driver.delete signout_path es auch ganz gut funktioniert. (Bedeutung Capybara abmeldet den Benutzer richtig)

UPDATE

Dies sind die Dateien (Sitzungen Controller und Helfer):

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

Ihr Code für 'authentication_pages_spec.rb' korrekt aussieht. Können Sie Ihren Controller anzeigen und Dateien routen? – halmeetdave

+0

@halmeetdave Ich habe gerade die Frage aktualisiert – ardiyu07

+0

Ihr Code sieht gut aus. Möglicherweise haben Sie in Capybara einen Fehler gefunden. Ich bin zu neu für Rails, um das zu bestätigen oder zu leugnen. – halmeetdave

Antwort

3

delete signout_path funktioniert nicht auf Capybara Feature-Spezifikationen. get, post, put, delete sind Controller-spezifische Methoden und sind nicht in Feature-Spezifikationen verfügbar.

Sie möchten auch tatsächliche Anfragen (per Klick, Absenden, etc ...) in Capybara Spezifikationen, da das ist im Allgemeinen, was Sie versuchen zu testen.

Wenn Sie sicherstellen möchten, dass eine Sitzung als "Setup" angezeigt wird, ist es am besten, dies über das Modell zu tun.

Nebenbei bemerkt, wenn Sie sich ansehen, was Sie "bei der erneuten Anmeldung" beschreiben, möchten Sie sich wahrscheinlich "abmelden", damit Sie sich tatsächlich "wieder anmelden" können.

+0

Heißt das die 'delete' Methode (oder' Capybara.current_session.driver.delete') sollte nicht an erster Stelle stehen? – ardiyu07

+0

Nun, es ist nicht allgemein üblich, diese Methoden für einen Feature/Acceptance Type Test zu verwenden. Sie möchten den vollständigen Stapel verwenden, um Ihre Szenarien zu durchlaufen. – nowk

+0

Die Methode 'delete' ist eigentlich eine Methode in' Rack :: Test' und startet eine andere Sitzung als Ihre Capybara-Sitzung. [Hier ist ein Artikel, der es erklärt] (http://www.elabs.se/blog/34-capybara-and-testing-apis). – carols10cents

2

können Sie versuchen, folgende:

page.driver.submit :delete, '/users/sign_out', {} 
Verwandte Themen