Как я могу заглушить метод controller_name для спецификации помощника RSpec? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть вспомогательный метод, который зависит от controller_name, и я хочу написать для него тесты.

module NavigationHelper
  def show_navigation?
    !sessions_controller? && !registrations_controller?
  end

  private
    def sessions_controller?
      controller_name.eql?('sessions')
    end

    def registrations_controller?
      controller_name.eql?('registrations')
    end
end

Это шаги настройки теста, которые я пробовал:

RSpec.describe NavigationHelper, type: :helper do
  describe '#show_navigation?' do
    it 'is false for pages served by the sessions controller' do
      # controller.params[:controller] = 'sessions'
      # assign(:controller, 'sessions')
      # controller = SessionsController
      # helper.stub(:controller_name).and_return('sessions')
      # allow(helper).to receive(:controller_name) { 'sessions' }
      expect(show_navigation?).to eq(false)
    end
  end
end

Как я могу соответствующим образом заглушить звонок на controller_name?

1 Ответ

0 голосов
/ 25 сентября 2019

Вот рабочее решение:

require 'rails_helper'

RSpec.describe NavigationHelper, type: :helper do
  describe '#show_navigation?' do
    context 'SessionsController' do
      let(:controller_name) { 'sessions' }
      it { expect(show_navigation?).to eq(false) }
    end

    context 'RegistrationsController' do
      let(:controller_name) { 'registrations' }
      it { expect(show_navigation?).to eq(false) }
    end

    context 'other controllers' do
      it { expect(show_navigation?).to eq(true) }
    end
  end
end

Как еще можно решить эту проблему?

...