web-dev-qa-db-ja.com

rspec機能テストでcurrent_userにアクセス(考案)する方法は?

Deviseのドキュメントでは、コントローラーのテスト時にcurrent_userにアクセスする方法に関するヒントを提供しています。

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

ただし、機能テストを行う場合はどうでしょうか?コントローラーのいずれかのcreateメソッドをテストしようとしていますが、そのコントローラーでcurrent_user変数が使用されています。

問題は、deviseで提案されているマクロが@request変数を使用しており、機能仕様としてはnilであるということです。回避策は何ですか?

編集:

これは私の現在の仕様についてこれまでのところ持っているものです:

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

問題は、私のOrdersControllercurrent_user.orders呼び出しがあり、current_userが定義されていないため、/users/sign_inにリダイレクトされることです。

/spec/features/manage_orders.rbでこれを定義しました

21
Hommer Smith

から 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

例えば ​​:

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:

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
28
RMazitov

あなたが探していると思うものは次のとおりです。

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
2
Alec Rooney

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
1
Hany Elsioufy