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
Ihr Code für 'authentication_pages_spec.rb' korrekt aussieht. Können Sie Ihren Controller anzeigen und Dateien routen? – halmeetdave
@halmeetdave Ich habe gerade die Frage aktualisiert – ardiyu07
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