tutorial signup sign_in rails method instalar generate ruby-on-rails ruby-on-rails-4 rspec stub

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)