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
il codice per 'authentication_pages_spec.rb' sembra corretto. Puoi mostrare il controller e instradare i file? – halmeetdave
@halmeetdave Ho appena aggiornato la domanda – ardiyu07
Il tuo codice sembra buono. Potresti aver trovato un bug in Capybara. Sono troppo nuovo per Rails per confermare o negare questo però. – halmeetdave