Тест контроллера rspec с разработкой аутентификации - PullRequest
17 голосов
/ 17 сентября 2011

У меня проблема с контроллером 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, моя спецификация индекса merchants_controller не работает. Но если я закомментирую authenticate_user! затем спецификация проходит,

без authenticate_user! отладчик действия индекса отлавливается, но с authenticate_user! отладчик не пойман.

Я думаю, что есть проблема в подборе current_user, и я не могу понять это.

Помоги мне ..

Ответы [ 2 ]

23 голосов
/ 17 сентября 2011

Читали ли вы документы по 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)
4 голосов
/ 09 ноября 2015

Другая альтернатива

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...