ruby on rails - mexicali - ¿Cómo acceder(diseñar) current_user en una prueba de características de rspec?
generate controller devise (3)
En la documentación del dispositivo, brindan consejos sobre cómo puede tener acceso a current_user al probar un controlador:
Sin embargo, ¿qué pasa cuando se hace una prueba de características? Estoy intentando probar un método de creación de uno de mis controladores, y en ese controlador se usa la variable current_user.
El problema es que la macro sugerida en el dispositivo utiliza la variable @request y es nula para una especificación de característica. ¿Qué es una solución?
EDITAR:
Esto es lo que tengo hasta ahora para mi especificación actual:
feature ''As a user I manage the orders of the system'' do
scenario ''User is logged in ad an admin'' do
user = create(:user)
order = create(:order, user: user)
visit orders_path
#Expectations
end
end
El problema es que en mi OrdersController
tengo una llamada current_user.orders
, y dado que current_user
no está definido, me redireccionará a /users/sign_in
.
He definido esto en /spec/features/manage_orders.rb
Esto es lo que creo que estás buscando:
require ''spec_helper''
include Warden::Test::Helpers
Warden.test_mode!
feature ''As a user I manage the orders of the system'' do
scenario ''User is logged in ad an admin'' do
user = create(:user)
login_as(user, scope: :user)
order = create(:order, user: user)
visit orders_path
#Expectations
end
end
Si te he entendido bien, tal vez necesites usar
subject.current_user.email
#or
controller.current_user.email
por ejemplo :
describe OrdersController, :type => :controller do
login_user
describe "POST ''create''" do
it "with valid parametres" do
post ''create'', title: ''example order'', email: subject.current_user.email
end
end
end
controller_macros.rb:
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
#user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the "confirmable" module
sign_in user
end
end
end
No olvides incluir esto en tu spec_helper.rb:
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
puede definir login_user como un método para que el usuario inicie sesión de la siguiente manera (póngalo en la carpeta de soporte):
def login_user
Warden.test_mode!
user = create(:user)
login_as user, :scope => :user
user.confirmed_at = Time.now
user.confirm!
user.save
user
end
Luego en el escenario diga:
user = login_user