如何在rspec特性测试中访问(设计)current_user?

Hom*_*ith 21 ruby rspec ruby-on-rails devise

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

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

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

问题是设计中建议的宏使用@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
Run Code Online (Sandbox Code Playgroud)

问题是,在我OrdersControllercurrent_user.orders电话中,由于current_user没有定义,它会重定向到我/users/sign_in.

我在下面定义了这个 /spec/features/manage_orders.rb

RMa*_*tov 28

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

如果我理解你的话,也许你需要使用

subject.current_user.email
#or
controller.current_user.email
Run Code Online (Sandbox Code Playgroud)

例如 :

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
Run Code Online (Sandbox Code Playgroud)


Ale*_*ney 2

我认为您正在寻找以下内容:

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
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最正确的答案,因为它非常接近 devise wiki 上官方推荐的功能规格(不是控制器规格)https://github.com/plataformatec/devise/wiki/How-To:-Test -与水豚 (2认同)