如何在 rspec 功能测试中访问(设计)current_user? [英] How to access (devise) current_user in a rspec feature test?

查看:16
本文介绍了如何在 rspec 功能测试中访问(设计)current_user?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在设计文档中,他们提供了有关在测试控制器时如何访问 current_user 的提示:

In the devise documentation they give tips on how you can have access to current_user when testing a controller:

https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29

但是,在进行功能测试时呢?我正在尝试测试我的一个控制器的 create 方法,并在该控制器中使用 current_user 变量.

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.

问题是 devise 中建议的宏使用了@request 变量,对于特性规范它是 nil.什么是解决方法?

The problem is that the macro suggested in devise uses the @request variable, and it is nil for a feature spec. What is a workaround?

这是我目前的规格:

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 没有定义,它会重定向我/users/sign_in.

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.

我在 /spec/features/manage_orders.rb

推荐答案

来自 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

例如:

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

不要忘记将其包含在您的 spec_helper.rb 中:

Don't forget to include this into your spec_helper.rb :

config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller

这篇关于如何在 rspec 功能测试中访问(设计)current_user?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆