Rahul Sagore
Rahul Sagore

Reputation: 1668

RSPEC NoMethodError: helper method calling another controller's action -

I have a controller file:

some_controller.rb:

class SomeController < ActionController::Base
    def get_params
      # Do something with params
    end
end

And a helper file:

module SomeHelper
   def modify_params
      get_params
   end
end

And rspec File for helper:

require 'spec_helper'

describe SomeHelper do
   describe 'check_if_param_has_key' do

   it "checks if param has key" do
     modify_params.should eql(true)
   end
end

Here, I am calling controller's method inside helper method. Now I am writing test cases for helper method modify_param. But it throws error : NoMethodError: get_params

Is there a way to access controller's method inside helper spec? Is this the right way to do it? Or Am I missing something in this?

Edited: The controller is ApplicationController, and method inside it return string containing which controller/method was called on page load, by looking at params[:controller], params[:action]

Upvotes: 2

Views: 1090

Answers (2)

Rahul Sagore
Rahul Sagore

Reputation: 1668

My problem has been solved by making get request to the page:

describe 'check if the home page by checking params', :type => :request do
   it 'return true if page is Home page' do        
     get "/homepage"
     helper.modify_params.should eql(true)
   end
end

In above code, after calling get request to homepage, helper method will have access to all the params and controller action it is calling. All my test cases have been passed.

Upvotes: 1

Drenmi
Drenmi

Reputation: 8787

As the author of RSpec has pointed out, helper tests are conceptually unrelated to controllers. So even if there was a way, you'd likely not want to bring the controller into the picture. You can easily stub out the method call in your spec:

describe SomeHelper do
  describe "#foo" do
    before do
      allow(helper).to receive(:bar).and_return("hello")
    end

    it { expect(helper.foo).to eql("hello") }
  end
end

Even if you had a controller, you'd likely have to stub the method call there, to cover the edge case.

Note that this stubbing a method not defined in the helper will fail if you're using verifying doubles.

Upvotes: 1

Related Questions