如果它是一个复杂的对象,如何在rspec中匹配'with'

时间:2013-10-28 19:32:14

标签: ruby rspec net-http

我执行以下操作:

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的实例变量。

是否有某种方法可以用较少的痛苦来调用块或某些东西来进行此测试?

1 个答案:

答案 0 :(得分: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