Richard
Richard

Reputation: 2355

How can I stub the controller_name method for a RSpec helper spec?

I have a helper method that is dependent upon controller_name, and I want to write tests for it.

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

These are the test setup steps i have tried:

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

How can I appropriately stub the call to controller_name?

Upvotes: 0

Views: 742

Answers (2)

Richard
Richard

Reputation: 2355

Here's a working solution:

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

How else might this problem be solved?

Upvotes: 1

Jesper Rønn-Jensen
Jesper Rønn-Jensen

Reputation: 111616

the answer from Richard did not work for me.

I had to change from

let(:controller_name) { 'sessions' }

to

before do
  allow(helper).to receive(:controller_name).and_return 'sessions'
end

Now I can verify as usual in my helpers.

Upvotes: 2

Related Questions