2010-09-15 33 views
6

我试图用rspec在我的current_user(使用修改后的restful_authentication auth解决方案)上剔除方法。我完全不确定如何在我的控制器规格中访问此方法。 current_user本身不起作用。我需要首先获得控制器吗?我该怎么做呢?RSpec访问application_controller方法,如'current_user'

使用rails 2.3.5rspec 1.3.0rspec-rails 1.3.2

# my_controller_spec.rb 
require 'spec_helper' 

describe MyController do 

    let(:foos){ # some array of foos } 

    it "fetches foos of current user" do 
    current_user.should_receive(:foos).and_return(foos) 
    get :show 
    end 
end 

主要生产

NoMethodError in 'ChallengesController fetches foos of current user' 
undefined method `current_user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1::Subclass_1::Subclass_2::Subclass_2:0x7194b2f4> 

回答

2

RSpec的护栏给您控制器示例使用了controller方法。所以:

controller.stub!(:current_user).with(:foos).and_return(foos)

应该工作。

+0

真棒,我会测试此提到,顺便说一句,什么是'之间的区别stub'和'stub!' – brad 2010-09-16 12:26:30

+1

None - 'stub'是'stub!'的别名,所以它们可互换 – zetetic 2010-09-16 16:56:18

+0

工作! thx一堆 – brad 2010-09-21 14:32:09

0

我不完全熟悉restful_authentication,只是Authlogic和设计,但它可能在current_user类似的是一个控制器方法而不是一个对象,这就是为什么调用should_receive不按预期工作(你正在设定的对象的期望current_user返回,但该方法在期望范围内无法访问)。

试试这个:

stub!(:current_user).and_return(foos)

+0

我无法得到它吨,只是存根owork()我需要controller.stub以上 – brad 2010-09-21 14:32:26

1

它怎么知道在哪里可以找到current_user?这应该解决它:

subject.current_user.should_receive(:foos).and_return(foos) 
0

我读了这个,并调整了我的一点。如果你只是想在用户对象传递到您的Rspec的测试,您可以使用此:

  1. 首先,创建RSpec的测试中的用户对象。例如:(使用任何属性,你需要或需要创建用户对象)

    用户= User.create(名称:“泰德”)

    (注:你也可以使用从工厂FactoryGirl)现在

  2. ,与被保存到变量 “用户”,这样做同样的Rspec的测试范围内的用户对象:!

    controller.stub(:CURRENT_USER).and_return(用户)

应该工作...

相关问题