How to check the return value of private methods in a controller

I want to test private methods (not action) of a controller using rspec

class FooController < ApplicationController
  def some_methods( var )
    if  var 
      return 1
      return 2

  def some_action
    var = true
    r = some_methods(var)



require 'spec_helper'

describe FooController do
   describe "GET index" do
      it "get get return value from some_methods" do
          @controller =
          r =@controller.instance_eval{ some_action }  
          r.should eq 2


This is my code rspec

. However, it is r

always 1 and I have no idea how to pass the paramater to some_action

. How can I check valid return values some_methods

using rspec method? (eg r.should be_nil


link but doesn't work:


source to share

3 answers

I am still a little confused. You don't have to care about the return value of the action controller . Actions should provide content, not return meaningful values. But I'll try to answer anyway.

If you are trying to make sure that you are FooController#some_action

calling a private method #some_methods

with a specific parameter, you can use #should_receive


describe FooController do
  describe 'GET index' do
    it 'should get the return value from some_methods' do
      get :index


This example will fail if the controller never receives the message :some_methods

, but it doesn't actually check the return value of the method #some_action

(because that almost never makes sense).

If you need to test behavior #some_methods

, you must write separate tests for this, using the techniques discussed in the articles you linked to.



It looks like you have several different problems here:

  • Why does r always return? r is always 1 because you are calling some_action

    from insance_eval. some_action

    calls some_methods(true)

    and some_methods

    returns 1 if passed true. With the code you provided some_action

    will always return 1

  • I assume these are just typos, but your class name FooController

    and controller is your testing in your rspec TestController

    . In addition, the feature is some_methods

    not marked as confidential.

  • How to pass parameters , you should be able to call some_methods

    directly from the instance_eval block and pass as a normal function call:

    r = @controller.instance_eval{ some_methods(false) }

    r.should eq 2



Log into the log with print / puts or use debugger 'rails-debug' to check the value at runtime.

puts r = some_methods (var)



All Articles