我想用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
)
引用但不起作用:
答案 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)
看起来你在这里遇到了一些不同的问题:
为什么r总是返回1? r始终为1,因为您从insance_eval调用some_action
。 some_action
调用some_methods(true)
,some_methods
如果传入true,则返回1.使用您提供的代码,some_action
将始终返回1
我猜这些只是错字,但你的班级名是FooController
,而你在rspec中的测试控制器是TestController
。此外,some_methods
功能未标记为私人。
如何传递参数,您应该能够直接从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)
放入