Ruby on rails 如何在rspec特性测试中访问(设计)当前用户?
在Deave文档中,他们给出了测试控制器时如何访问当前用户的提示: 但是,在进行特性测试时会发生什么情况?我正在尝试测试我的一个控制器的create方法,在该控制器中使用了current_用户变量 问题是Deviate中建议的宏使用@request变量,而对于功能规范,它是零。解决方法是什么 编辑: 这是到目前为止我对当前规范的了解:Ruby on rails 如何在rspec特性测试中访问(设计)当前用户?,ruby-on-rails,ruby,rspec,devise,Ruby On Rails,Ruby,Rspec,Devise,在Deave文档中,他们给出了测试控制器时如何访问当前用户的提示: 但是,在进行特性测试时会发生什么情况?我正在尝试测试我的一个控制器的create方法,在该控制器中使用了current_用户变量 问题是Deviate中建议的宏使用@request变量,而对于功能规范,它是零。解决方法是什么 编辑: 这是到目前为止我对当前规范的了解: feature 'As a user I manage the orders of the system' do scenario 'User is log
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
问题是,在我的OrdersController
中,我有一个当前用户。orders
调用,由于未定义当前用户
,它会将我重定向到/users/sign\u in
我已经在
/spec/features/manage_orders.rb
下定义了这一点,我认为您需要的是:
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
您可以将login_user定义为用户登录的方法,如下所示(将其放在支持文件夹中): 然后在场景中说:
user = login_user
从
如果我对你的理解正确,也许你需要使用
subject.current_user.email
#or
controller.current_user.email
例如:
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
控制器_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
别忘了将其包含在spec_helper.rb中:
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
我也用过类似的东西,请看和。可能包括您试图编写的测试代码?你可以假装
current_user
在那里,我认为这将有助于澄清你的意图。我不会记录用户,因为我不知道如何在功能rspec测试中做到这一点。这对我很有效:subject.current_user.email控制器宏放在哪里?在spec/support文件夹中?@aldrien.h是。@Hommer Smith这是正确的答案。我也测试过了,效果很好。如果它被接受,它将在搜索查询中显示为已解决。此答案与Desive wiki页面一起用于控制器规格。问题是关于特性规格;Deave有一个单独的页面:这是迄今为止最正确的答案,因为它非常接近Deave wiki上为功能规格(而不是控制器规格)推荐的官方方式
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller