ruby-on-rails - signup - instalar devise rails
RSpec: cómo apilar el método heredado current_user(w/o Devise)? (3)
Tengo un controlador basado en el tutorial RoR4 de MHartl
Y al igual que MHartl, no uso Devise , implementé mi propio sistema de autenticación.
¿Tiene problemas con la RSpec para UsersController#Edit
ya que la vista tiene una llamada a current_user.admin?
y el controlador llama a @path_switch = path_switch
Sigo recibiendo errores RSpec a lo largo de las líneas de:
1) User Pages Edit
Failure/Error: visit edit_user_path(user)
NoMethodError:
undefined method `admin?'' for nil:NilClass
# ./app/controllers/users_controller.rb:106:in `path_switch''
# ./app/controllers/users_controller.rb:53:in `edit''
# ./spec/requests/user_pages_spec.rb:54:in `block (3 levels) in <top (required)>''
Controlador de usuarios:
class UsersController < ApplicationController
...
def edit
@user = User.find(params[:id])
@path_switch ||= path_switch #error
end
...
def path_switch
if current_user.admin? #error
users_path
else
root_path
end
end
end
Encontré este artículo realmente útil que me da la esperanza de que estoy en el camino correcto, pero no puedo hacerlo funcionar.
Aquí está hasta donde he conseguido (actualizado):
user_pages_spec.rb:
require ''spec_helper''
require ''support/utilities''
describe "User Pages" do
#include SessionsHelper
let(:user) { FactoryGirl.create(:user) }
let(:current_user) {user}
subject { page }
describe "Edit" do
before do
sign_in(user)
visit edit_user_path(user)
end
it ''(check links and content)'' do
should have_button(''Submit'')
should have_link(''Cancel'')
should have_content(user.fname+"/'s profile")
end
...
end
...
end
Pero current_user
sigue volviendo a nil
Cualquier ayuda / orientación es apreciada. ¡Gracias!
La adición de include SessionsHelper
en el bloque de descripción superior de mi user_pages_edit.rb
parece intentar y usar el inicio de sesión (ruta) de ese ayudante. Creando un problema entre RSpec y cookies.permanent
. Así que eso es un busto.
desafortunadamente , esto me lleva de vuelta a mi .admin?
error.
Hay dos llamadas a current_user.admin?
Uno está en el controlador:
def path_switch
if current_user.admin? #error current_user == nil
users_path
else
root_path
end
end
Uno está en la vista como ERB:
<% if current_user.admin? %>
<div class="row col-xs-6 col-sm-6 col-md-3">
<div class="input-group input-selector">
...
Todo lo que tengo que hacer es averiguar cómo configurar current_user.admin = true
y pasarlo al controlador (y luego a la vista) para que la página pueda cargarse. Para hacer eso, todo lo que necesito hacer es establecer current_user = user
porque user.admin == true
.
Para mí, trabajé con:
before { controller.stub!(:current_user).and_return(user) }
Si está realizando una prueba unitaria de su controlador, simplemente puede apagar su current_user
en un bloque anterior, como este:
let(:user) { ... }
# RSpec version <= 2 syntax:
before { controller.stub(:current_user) { user } }
# RSpec version >= 3 syntax:
before { allow(controller).to receive(:current_user) { user } }
Si está realizando una función o solicita una prueba , le aconsejo que realice un inicio de sesión real creando un usuario en su base de datos y luego pase a través de su página de inicio de sesión con estas credenciales de usuario.
Aquí parece que está haciendo una prueba de características, debe escribir un ayudante que realice la creación del registro de usuario y pasar por el inicio de sesión.
Además, en la prueba de características para ganar mucho tiempo mientras ejecuta su prueba, no dude en agrupar sus afirmaciones en el mismo bloque. Claramente, en lugar de:
it { should have_button(''Submit'')}
it { should have_link(''Cancel'')}
it { should have_content(user.fname+"/'s profile")}
Puedes escribir
it ''check links and content'' do
should have_button(''Submit'')
should have_link(''Cancel'')
should have_content(user.fname+"/'s profile")
end
Eso evitará generar varias sesiones de su entorno de características y también iniciar sesión varias veces.
Tambien funciona
user = create(:user) #FactoryGirl
allow(controller).to receive(:current_user).and_return(user)