0

我执行以下操作:

class FakeResponse
  def body
    'access_token=token'
  end
end
Net::HTTP.stub(:get_response).and_return(FakeResponse.new)

这很好用,但我也想测试一下请求的 URL 是什么。所以我愿意

url = 'http://google.de'
Net::HTTP.stub(:get_response).with(URI.parse(url)).and_return(FakeResponse.new)

这实际上不起作用,因为它不是同一个 URI 实例。事实上,我只想针对该 URI 的实例变量进行测试。

有什么方法可以调用一个块或其他东西来减轻痛苦吗?

4

1 回答 1

1

你可以试试这个:

original_get_response = Net::HTTP.method(:get_response)
Net::HTTP.stub(:get_response) do |uri|
  (uri.to_s == 'http://google.de') ? FakeResponse.new : original_get_response.call(uri)
end

看看and_call_original一年前关于加法的讨论,似乎像这样存储和调用原始方法是一个很常见(但很尴尬)的习惯用法。(现在可能有一个original_method电话可供您使用,但我没有方便的构建来测试它。)

编辑:后来,我开始构建并尝试简单地使用.with(URI('...')),效果很好。除非我误解了这个问题?

require 'spec_helper'
require 'net/http'

describe :nethttp do
  before :each do
    Net::HTTP.stub(:get_response).and_return('something')
    Net::HTTP.stub(:get_response).with(URI('http://www.google.com')).and_return('something else')
  end

  it { Net::HTTP.get_response(URI('http://www.google.com')).should eql 'something else' }
  it { Net::HTTP.get_response(URI('http://www.google.co.uk')).should eql 'something' }
end
于 2013-10-28T20:18:24.610 回答