【问题标题】:Rails: test a helper that needs access to the Rails environment (e.g. request.fullpath)Rails:测试需要访问 Rails 环境的助手(例如 request.fullpath)
【发布时间】:2012-09-21 09:39:41
【问题描述】:

我有一个助手可以访问request.fullpath。在隔离的辅助测试中,request 不可用。我该怎么办?我可以以某种方式嘲笑它或类似的东西吗?

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

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

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

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

非常感谢您的帮助。

【问题讨论】:

  • 你的 spec_helper.rb 中有“require 'rspec/rails'”吗?

标签: ruby-on-rails testing rspec


【解决方案1】:

是的,您可以模拟请求。我在这里有一个很长的答案来描述如何做到这一点,但实际上这不一定是你想要的。

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

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)

如果你的 mock 收到你没有存根的消息,Rspec 会抱怨。如果还有其他东西,只需在帮助器对象上调用您的请求帮助器方法,您在测试中并不关心,您可以通过将模拟设置为“空对象”来关闭 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

【讨论】:

  • 忽略我之前的回答。它描述了如何模拟请求对象,但这不一定是在帮助规范中获得所需内容的正确方法。见上文。
  • 非常感谢,它就像一个魅力。不过,我有点不确定,为什么会这样。直接调用helper.my_method 和简单的my_method 调用不一样吗?在测试助手时,我应该总是在helper 对象上调用它们吗?控制器和视图测试是否有类似的对象?
  • 有!你可以用匿名控制器做很多有趣的事情; rspec-rails 为您提供了一个继承自 ApplicationController 的 controller 对象,您可以在其上定义存根操作以测试 before_filters 或其他任何内容。老实说,我不确定我是否足够专家来解释为什么您需要在 helper 对象上调用您的方法。如果您想了解更多信息,我建议您在relishapp.com/rspec/rspec-rails/v/2-11 学习 rspec 文档。
  • 谢谢,我要去看看你提到的文档。哇,自从我 3 年前暂停我的网页设计活动以来,Rails 有了很多新的东西……但是再次成为 Rails 大车的一员真是太好了。 :-)
【解决方案2】:

在帮助规范中,您可以使用 controller.request 访问请求(因此 controller.request.stub(:fullpath) { "whatever" } 应该可以工作)

【讨论】:

  • 谢谢,但这似乎无法使request 对象在帮助器中可用(这是问题所在)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多