Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails - How to mock or access methods defined in ApplicationController from helper spec?

I'm trying to write specs for a Rails helper. This helper calls a method defined in ApplicationController and exposed through helper_method:

app/helpers/monkeys_helper.rb:

module MonkeysHelper
  def current_monkey_banana_count
    # current_monkey is defined in ApplicationController
    current_monkey.present? ? current_monkey.banana_count : 0 
  end
end

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base   
  helper_method :current_monkey

  protected

  def current_monkey
    @current_monkey ||= Monkey.find(session[:monkey_id])
  end
end

If I call current_monkey_banana_count from a view and access it through the browser, it works fine. But if I call it from a spec like this:

spec/helpers/monkeys_helper_spec.rb:

RSpec.describe MonkeysHelper, type: :helper do
  describe "#current_monkey_banana_count" do
    it "returns 0 if there is no monkey" do
      expect(helper.current_monkey_banana_count).to eq 0
    end
  end
end

Then I get this error when I run the spec:

NameError:
       undefined local variable or method `current_monkey' for #<#<Class:0x007fe1ed38d700>:0x007fe1e9c72d88>

Rspec documentation says:

To access the helper methods you're specifying, simply call them directly on the helper object. NOTE: helper methods defined in controllers are not included.

Any idea how to either mock current_monkey or make it visible from inside current_monkey_banana_count?

Thanks!

like image 575
Andrés Mejía Avatar asked Dec 19 '25 11:12

Andrés Mejía


1 Answers

I found a (nasty) way to do it, but it works:

spec/helpers/monkeys_helper_spec.rb:

require 'rails_helper'

RSpec.describe CartsHelper, type: :helper do
  before do
    def helper.current_monkey; end
  end

  describe "#current_monkey_banana_count" do
    it "returns 0 if there is no cart" do
      expect(helper).to receive(:current_monkey).and_return(nil)
      expect(helper.current_monkey_banana_count).to eq 0
    end

    it "returns monkey.banana_count if there is a monkey" do
      expect(helper).to receive(:current_monkey).and_return(Monkey.create!(banana_count: 5))
      expect(helper.current_monkey_banana_count).to eq 5
    end
  end
end
like image 190
Andrés Mejía Avatar answered Dec 21 '25 03:12

Andrés Mejía



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!