当前位置: 首页 > 知识库问答 >
问题:

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

马淳
2023-03-14

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

https://github.com/plataformatec/devise/wiki/How-To:-测试控制器-带导轨-3-和-4-(和RSpec)

但是,在进行特性测试时会发生什么情况?我正在尝试测试我的一个控制器的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中,我有一个current_user.orders调用,并且由于没有定义current_user,它将我重定向到/用户/sign_in

我已经在/spec/特性/manage_orders.rb下定义了这个

共有3个答案

潘兴朝
2023-03-14

您可以将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

然后在场景中说:

user = login_user
齐向笛
2023-03-14

这是我认为你在寻找的:

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
卢伟志
2023-03-14

从…起https://github.com/plataformatec/devise/wiki/How-To:-测试控制器-带导轨-3-和-4-(和RSpec)

如果我对你的理解正确,也许你需要使用

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

控制器\u宏。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
 类似资料:
  • 我可以从控制器规格访问当前用户,没有问题。从Rspec内部。功能规范,我无法使当前用户可用。 我需要当前用户的原因是,我正在测试发送邀请功能。我导航到发送邀请的页面,填写邀请[to_user]字段,然后单击“发送邀请”。我想确保页面上显示正确的flash消息。但是,我正在通过单击“发送邀请”触发的控制器操作中将发送者\u id设置为当前\u用户id,我需要在此处定义当前\u用户。 我设置了支持/控

  • 问题内容: 在执行ModelForm时,我想根据当前用户是否为超级用户执行不同类型的验证检查。如何访问当前的请求用户? 问题答案: 您可以将用户对象作为额外的参数传递给表单构造函数。 例如 构造函数将如下所示: 然后根据需要在clean_XX表单中使用user

  • 我有一个控制器方法,它使用<code>redirect_to:back<code>将用户重定向回原始页面。方法如下所示。 我试图为有效和无效的创建方法编写一个集成测试。下面给出了集成测试。 我得到以下与。 我尝试在创建方法中使用HTTP REFERRER(如下所述)而不是redirect_to:back,但我仍然收到错误。 我不确定我需要改变什么来通过redirect_to :back的测试。我曾

  • 问题内容: 给出类似的东西: 如何测试执行时它将针对通道上收到的每条消息运行? 问题答案: 您拥有的这段代码不是很容易测试。首先,绝对要摆脱这个全局变量。相反,在构造函数中接受redis实例。 然后在测试中,您可以制作一个完全可以控制但与您使用的api一致的虚拟redis。遵循以下原则: 这种很酷的技术称为“依赖注入”(或者像某些人所说的那样,“将参数传递给构造函数”)。

  • 问题内容: 控制器中包含以下内容: 规格: 但这不起作用: 我看到“保存文件”对话框,但显然不是“警告”对话框。 如何单击确定并让水豚看到数据? 问题答案: 改编自CollectiveIdea和其他来源。 在OSX上工作。Firefox 34.0.5 规格: 规范助手: 共享/download_helper.rb:

  • 我必须为我的一个功能列表页面编写集成测试用例,该功能索引方法具有如下代码 现在,当我试图为此编写一个测试用例时,它抛出了一个错误 现在我要做的是在下面的beforeach语句中编写登录过程,然后为features列表页面编写测试用例 您能告诉我如何获得当前用户吗? 仅供参考,我曾使用Desive gem,并与Rspec一起处理集成测试用例 这是我的规格文件,这是我的食物类别规格.rb