6

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

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

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

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

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

非常感谢您的帮助。

4

2 回答 2

5

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

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

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
于 2012-09-21T13:25:06.600 回答
0

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

于 2012-09-21T10:14:54.423 回答