[英]How to access (devise) current_user in a rspec feature test?
In the devise documentation they give tips on how you can have access to current_user when testing a controller: 在设计文档中,他们提供了有关在测试控制器时如何访问current_user的提示:
https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29 https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29
However, what about when doing a feature test? 但是,在进行功能测试时呢? I am trying to test a create method of one of my controllers, and in that controller is used the current_user variable. 我正在尝试测试我的一个控制器的create方法,并在该控制器中使用current_user变量。
The problem is that the macro suggested in devise uses the @request variable, and it is nil for a feature spec. 问题是设计中建议的宏使用@request变量,对于特征规范它是零。 What is a workaround? 什么是变通方法?
EDIT: 编辑:
This is what I have so far for my current spec: 到目前为止,这是我目前的规格:
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
The problem is that in my OrdersController
I have a current_user.orders
call, and since current_user
is not defined, it will redirect me to /users/sign_in
. 问题是在我的OrdersController
我有一个current_user.orders
调用,并且由于current_user
没有定义,它会将我重定向到/users/sign_in
。
I have defined this under /spec/features/manage_orders.rb
我在/spec/features/manage_orders.rb
下定义了这个
from https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29 来自https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29
if i have understood you right, maybe you need to use 如果我理解你的话,也许你需要使用
subject.current_user.email
#or
controller.current_user.email
for example : 例如 :
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 : 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
Don't forget to include this into your spec_helper.rb : 不要忘记将其包含在spec_helper.rb中:
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
Here's what I think you are looking for: 以下是我认为您正在寻找的内容:
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
you can define login_user as a method for the user to login as follows (put it in support folder): 您可以将login_user定义为用户登录的方法,如下所示(将其放在支持文件夹中):
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
Then in the scenario say: 然后在场景中说:
user = login_user
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.