2012-09-21 57 views
5

我有一个助手访问request.fullpath。在单独的帮手测试中,request不可用。我该怎么办?我能以某种方式嘲笑它或类似的东西吗?Rails:测试需要访问Rails环境的助手(例如request.fullpath)

我正在使用最新版本的Rails和RSpec。这里是我的帮助是什么样子:

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

所以有问题的代码行#4中的助手需要访问request对象,它是不是在帮助规范使用。

非常感谢您的帮助。

+0

你有“需要“的RSpec/Rails的”在你的spec_helper.rb? – Rubyman

+0

是的,我喜欢。谢谢。 –

回答

4

是的,你可以嘲笑的请求。我在这里描述了如何做到这一点,但实际上这并不一定就是你想要的。

只需在示例中的助手对象上调用您的助手方法。像这样:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

这会让你访问一个测试请求对象。如果你需要指定请求路径特定的值,你可以这样做是这样的:

before :each do 
    helper.request.path = 'some-path' 
end 

实际上,对于完整性,让我有我原来的答案,因为这取决于你想要什么做它可能仍然有帮助。

这里是你如何嘲笑请求:

request = mock('request') 
controller.stub(:request).and_return request 

您可以添加存根方法同样返回的请求

request.stub(:method).and_return return_value 

和替代语法来嘲笑&存根都在同一个行:

request = mock('request', :method => return_value) 

如果您的模拟收到messa,Rspec会抱怨ges,你不存根。如果还有其他的东西只要在助手对象上调用你的请求帮助器方法就是在测试中你不关心,你可以通过使模拟成为“空对象”来关闭rspec。喜欢像这样

request = mock('request').as_null_object 

它看起来像所有你可能需要得到您的具体检验合格是这样的:

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

忽略我以前的答案。它描述了如何模拟请求对象,但这不一定是在帮助程序规范中获得所需内容的正确方法。往上看。 – gregates

+0

非常感谢,它像一个魅力。不过,我有点不确定,为什么它。直接调用'helper.my_method'与简单的'my_method'调用不一样吗?在测试助手时,我是否应该始终将它们称为“助手”对象?控制器和视图测试是否有类似的对象? –

+1

有!有很多有趣的东西你可以用匿名控制器来做; rspec-rails为您提供了一个继承自ApplicationController的'controller'对象,并且您可以在其上定义stub动作来测试before_filters或其他任何内容。老实说,我不确定我是否足够专业,可以解释为什么你需要在'helper'对象上调用你的方法。如果您想了解更多信息,我建议您在https://www.relishapp.com/rspec/rspec-rails/v/2-11上学习rspec文档。 – gregates

0

在助手规格,您可以访问使用controller.request请求(所以controller.request.stub(:fullpath) { "whatever" }应该工作)

+0

谢谢,但这似乎并没有使帮助器中的request对象可用(这是问题)。 –