Как получить доступ (разработать) current_user в тесте функции rspec?
В документации по разработке они дают советы о том, как вы можете иметь доступ к current_user при тестировании контроллера:
https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29
Однако, что делать при тестировании функций? Я пытаюсь проверить метод создания одного из моих контроллеров, и в этом контроллере используется переменная current_user.
Проблема заключается в том, что макрос, предлагаемый в разработке, использует переменную @request, и она равна нулю для спецификации спецификации. Что такое обходной путь?
EDIT:
Это то, что у меня есть для моей текущей спецификации:
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
.
Я определил это под /spec/features/manage_orders.rb
Ответы
Ответ 1
из 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
Ответ 2
вы можете определить 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
Ответ 3
Вот что я думаю, что вы ищете:
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