Тестирование метода @current_user с использованием RSpec - PullRequest
3 голосов
/ 01 апреля 2011

Я пытался сделать это в течение нескольких дней, но я не могу понять это.У меня есть следующий код в моем контроллере:

@some_object = @current_user.some_method

В моей спецификации я хочу прикрепить ловушку should_receive к этому методу, но не могу заставить его работать.Я пробовал все это, но ни один из них не работает:

assigns[:current_user].should_receive(:some_method).at_least(:once) # expected 1, got 0
User.should_receive(:some_method).at_least(:once) # expected 1, got 0

Как правильно проверить это?Я запускаю это в моей спецификации, и логин работает:

setup :activate_authlogic
...
UserSession.create(users(:rune))

Спасибо!

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011

Один пример взят из Ruby on Rails Tutorial .Вместо непосредственного задания и чтения @current_user он определяет два вспомогательных метода:

def current_user=(user)
  @current_user = user
end

def current_user
  @current_user
end

Позже они получают доступ к этому методу в тестах с использованием метода controller:

def test_sign_in(user)
  controller.current_user = user
end

Используя эту методологию, вы сможете использовать

controller.current_user.should_receive(:some_method).at_least(:once)
1 голос
/ 31 июля 2014

Вы не можете вызвать что-то похожее на контроллеры:

expect(current_user).to be_present
expect(user_signed_in?).to be_true

Таким образом, вы можете сделать это:

module ControllerMacros
  def current_user
    user_session_info = response.request.env['rack.session']['warden.user.user.key']
    if user_session_info
      user_id = user_session_info[0][0]
      User.find(user_id)
    else
      nil
    end
  end

  def user_signed_in?
    !!current_user
  end
end

Вы можете включить ControllerMacros вверхняя часть спецификации контроллера или включите его в spec_helper.rb примерно так:

RSpec.configure do |config|
  config.include ControllerMacros, type: :controller
end
...