Я пытаюсь заглушить аутентификацию для контроллера в 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 проходит?