2013-05-08 20 views
5

W Michael Hartl's Rails Tutorial (Rails 3.2) w Opisie 9,52:Szyny: Usuń żądanie w kapibarze, błąd lub mój błąd?

 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 

włożeniu tych dwóch wydruków. I, co ciekawe, dostałem wydruk tej samej strony (która nie powinna być, To miało doprowadzić cię z powrotem do korzenia po wysłaniu prośby DELETE). Gdy tak się stanie, ponieważ visit signin_path przenosi mnie z powrotem na stronę logowania, procedura logowania się powiedzie, podobnie jak przypadek testowy. Jednak drugi print page.html dał mi nagłówek użytkownika, który jest nadal zalogowany.

Po zmianie delete signout_path na click_link "Sign out" zadziałało.

Czy brakuje czegoś w moim kodu lub jest to błąd Kapibara? (Bo jestem pewien, że wszystko po prostu prawo ..)

UPDATE: Jeśli zmienię delete signout_path do Capybara.current_session.driver.delete signout_path również działa dobrze. (Czyli znaki Kapibara się użytkownikowi prawidłowo)

UPDATE

Są to pliki (kontroler sesje i pomocnicze):

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

kodzie dla 'authentication_pages_spec.rb' wygląda poprawnie. Czy możesz pokazać swój kontroler i trasować pliki? – halmeetdave

+0

@halmeetdave Właśnie zaktualizowałem pytanie – ardiyu07

+0

Twój kod wygląda dobrze. Być może znalazłeś błąd w kapibarze. Jestem zbyt nowy w Railsach, aby to potwierdzić lub zaprzeczyć. – halmeetdave

Odpowiedz

3

delete signout_path nie działa ze specyfikacjami funkcji Capybara. get, post, put, delete są specyficzne dla kontrolera i nie są dostępne w specyfikacji funkcji.

także chcą być co faktyczne żądania (poprzez kliknięcie, przedstawienia, itp ...) w specyfikacji Capybara ponieważ jest ogólnie co chce przetestować.

Jeśli chcesz mieć pewność, sesja jest jasne jak „setup”, to najlepiej zrobić to za pomocą modelu.

Na marginesie, jeśli spojrzysz na to, co opisujesz, "logując się ponownie", prawdopodobnie chcesz "wylogować się", aby móc "zalogować się ponownie".

+0

Mówisz, że metoda "delete" (lub "Capybara.current_session.driver.usunąć ") nie powinno być tam na pierwszym miejscu? – ardiyu07

+0

Cóż, nie jest powszechną praktyką stosowanie tych metod do testu typu/testu akceptacyjnego. Chcesz użyć pełnego stosu, aby uruchomić swoje scenariusze. – nowk

+0

Metoda 'delete' jest w rzeczywistości metodą w' Rack :: Test' i rozpoczyna inną sesję niż sesja Capybara. [Oto artykuł, który to wyjaśnia] (http://www.elabs.se/blog/34-capybara-and-testing-apis). – carols10cents

2

Można spróbować następujących czynności:

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