如何检查控制器中私有方法的返回值

时间:2012-03-26 06:38:19

标签: ruby-on-rails rspec

我想用rspec

测试控制器的私有方法(不是动作)
class FooController < ApplicationController
  def some_methods( var )
    if  var 
      return 1
    else 
      return 2
    end
  end

  def some_action
    var = true
    r = some_methods(var)
    r
  end
end

rspec的:

require 'spec_helper'

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

这是我的rspec代码。但是,r始终为1,我不知道如何将参数传递给some_action。  如何使用rspec方式验证some_methods的实际返回值? (例如:r.should be_nil

引用但不起作用:

  1. Rspec, Rails: how to test private methods of controllers?

  2. How to spec a private method

3 个答案:

答案 0 :(得分:4)

我还是有点困惑。您不应该关心控制器操作的返回值。操作应该呈现内容,而不是返回有意义的值。但无论如何我都会尽力回答。

如果您尝试确保FooController#some_action使用特定参数调用私有方法#some_methods,则可以使用#should_receive

describe FooController do
  describe 'GET index' do
    it 'should get the return value from some_methods' do
      controller.should_receive(:some_methods).with(true).and_return(1)
      get :index
    end
  end
end

如果控制器从未收到消息:some_methods,则此示例将失败,但它实际上并未检查方法#some_action的返回值(因为这几乎从未有意义)。

如果您需要测试#some_methods的行为,您应该使用您引用的文章中讨论的技术为其编写单独的测试。

答案 1 :(得分:2)

看起来你在这里遇到了一些不同的问题:

  1. 为什么r总是返回1? r始终为1,因为您从insance_eval调用some_actionsome_action调用some_methods(true)some_methods如果传入true,则返回1.使用您提供的代码,some_action将始终返回1

  2. 我猜这些只是错字,但你的班级名是FooController,而你在rspec中的测试控制器是TestController。此外,some_methods功能未标记为私人。

  3. 如何传递参数,您应该能够直接从instance_eval块调用some_methods并传入一个类似普通函数调用的参数:

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

    r.should eq 2

答案 2 :(得分:0)

使用print / puts语句检查日志,或使用调试器'rails-debug'在运行时检查值。

  

将r = some_methods(var)

放入