Проверка контроллера rspec с использованием аутентификации
У меня возникла проблема с контроллером проверки rspec, который вы используете для проверки подлинности.
У меня есть следующая настройка
Я включил
config.include Devise::TestHelpers, :type => :controller
в моем spec_helper.rb
В моем merchants_controller_spec.rb
describe MerchantsController do
before :each do
@user = Factory(:user)
@merchant = Factory(:merchant, :user_id => @user.id,:is_approved => false, :is_blacklisted => false)
controller.stub!(:current_user).and_return(@user)
end
describe "GET index" do
it "assigns all merchants as @merchants" do
merchant = Factory(:merchant,:is_approved => true, :is_blacklisted => false)
get :index
assigns(:merchants).should eq([merchant])
end
end
end
My merchants_controller.rb
class MerchantsController < ApplicationController
before_filter :authenticate_user!
def index
@merchants = Merchant.approved
debugger
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @merchants }
end
end
end
У меня есть область, одобренная в модели продавца
scope :approved, where(:is_approved => true, :is_blacklisted => false)
Теперь моя проблема даже в том, что я заштриховал current_user и вернул @user как current_user, у меня спецификация индекса my merchants_controller. Но если я прокомментирую authenticate_user! то спецификация проходит,
без authenticate_user! отладчик действия индекса пойман, но с authenticate_user! отладчик не пойман.
Я думаю, что есть проблема в subbing current_user, и я не могу это понять.
Помогите мне.
Ответы
Ответ 1
Прочитали ли вы документы в github?:
В состав Devise входят некоторые помощники тестов для функциональных спецификаций. Чтобы использовать их, вам просто нужно включить Devise::TestHelpers
в свой тестовый класс и использовать методы sign_in
и sign_out
. Такие методы имеют ту же подпись, что и в контроллерах:
sign_in :user, @user # sign_in(scope, resource)
sign_in @user # sign_in(resource)
sign_out :user # sign_out(scope)
sign_out @user # sign_out(resource)
Ответ 2
Другая альтернатива
RSpec.describe YourController, :type => :controller do
before do
user = FactoryGirl.create(:user)
allow(controller).to receive(:authenticate_user!).and_return(true)
allow(controller).to receive(:current_user).and_return(user)
end
# rest of the code
end