webentwicklung-frage-antwort-db.com.de

Zugriff auf (devise) current_user in einem rspec-Funktionstest

In der Dokumentation finden Sie Hinweise, wie Sie beim Testen eines Controllers auf current_user zugreifen können:

https://github.com/plataformatec/devise/wiki/How-To:-Testcontroller-mit-Rails-3-und-4-%28and-RSpec%29

Wie sieht es jedoch mit einem Funktionstest aus? Ich versuche, eine Erstellungsmethode eines meiner Controller zu testen, und in diesem Controller wird die Variable current_user verwendet.

Das Problem ist, dass das in devise vorgeschlagene Makro die Variable @request verwendet und es für eine Feature-Spezifikation gleich null ist. Was ist eine Problemumgehung?

BEARBEITEN:

Das ist was ich bisher für meine aktuelle Spezifikation habe:

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

Das Problem ist, dass ich in meiner OrdersController einen current_user.orders-Aufruf habe. Da current_user nicht definiert ist, wird ich zu /users/sign_in umgeleitet.

Ich habe dies unter /spec/features/manage_orders.rb definiert

19
Hommer Smith

von https://github.com/plataformatec/devise/wiki/How-To:-Testcontroller-mit-Rails-3-und-4-%28and-RSpec%29

wenn ich Sie richtig verstanden habe, müssen Sie vielleicht verwenden

subject.current_user.email
#or
controller.current_user.email

zum Beispiel :

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

Vergiss nicht, dies in deine spec_helper.rb aufzunehmen:

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

Ich denke, Sie suchen:

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

sie können login_user als Methode für den Benutzer definieren, um sich wie folgt anzumelden (im Support-Ordner ablegen): 

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

Dann sagen Sie im Szenario:

user = login_user
1
Hany Elsioufy