Стабилизация методов ApplicationController с помощью RSpec - PullRequest
0 голосов
/ 11 сентября 2011

Я пытаюсь заглушить аутентификацию для контроллера в rspec. Когда я заглушаю метод authorize, тест всегда проходит независимо от того, какое значение я предоставляю.

Контроллер:

class FoosController < ApplicationController
  before_filter :authorize
  ...
end

ApplicationController:

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :current_user

  protected

  def authorize
    return true if current_user

    flash[:error] = 'Please login'
    redirect_to signin_path
    false
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

Технические характеристики:

# this passes (expected)
it "..." do
  controller.stubs(:current_user).returns(User.new)
  get :index
  response.should be_success
end

# this fails (expected)
it "..." do
  controller.stubs(:current_user).returns(nil)
  get :index
  response.should be_success
end

# this passes (expected)
it "..." do
  controller.stubs(:authorize).returns(true)
  get :index
  response.should be_success
end

# Problem: this passes (unexpected)
it "..." do
  controller.stubs(:authorize).returns(false)
  get :index
  response.should be_success
end

Кажется, как только я заглушаю: authorize, независимо от того, какое значение установлено, он всегда проходит before_filter. Я думал, что это могут быть обозначения защищен / helper_method, но игра с ними ничего не изменила.

Почему заглушка: авторизация с ложью приводит к тому, что before_filter проходит?

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

Я думаю, вам нужно проверить, ЧТО визуализируется.

Глядя на ваш код, если цепочка вызовов действительно останавливается, когда authorize возвращает false, то что произойдет?

Нет никакого перенаправления или рендеринга вызова.

То есть это будет пустой ответ?

Пустой ответ все равно будет 200.

Однако, в зависимости откакую версию Rails вы используете, в Rails 3.1 возможно, что before_filter, возвращающий false, больше не останавливает цепочку.

Действительно, before_filter, который хочет остановить цепочку, должен это сделатьиз следующих

  1. перенаправить куда-нибудь
  2. сделать что-то
  3. повысить что-то
0 голосов
/ 15 июля 2013

Я отвечу на ваш последний вопрос Why does stubbing :authorize with false cause the before_filter to pass?

Вы заглушаете метод authorize, который буквально останавливает весь вызываемый код внутри него, но возвращает то, что вы явно возвращаете с заглушкой.

Он работает правильно, потому что когда вы заглушаете current_user на false, то авторизация вызывается полностью. Я думаю, что ваши последние тесты на самом деле ничего не проверяют для вас, но это только мое мнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...