Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rspec特性测试中访问(设计)当前用户?_Ruby On Rails_Ruby_Rspec_Devise - Fatal编程技术网

Ruby on rails 如何在rspec特性测试中访问(设计)当前用户?

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

在Deave文档中,他们给出了测试控制器时如何访问当前用户的提示:

但是,在进行特性测试时会发生什么情况?我正在尝试测试我的一个控制器的create方法,在该控制器中使用了current_用户变量

问题是Deviate中建议的宏使用@request变量,而对于功能规范,它是零。解决方法是什么

编辑:

这是到目前为止我对当前规范的了解:

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