【问题标题】:How to stub a HTTParty request inside a method for testing?如何在测试方法中存根 HTTParty 请求?
【发布时间】:2018-12-27 10:31:13
【问题描述】:

我创建了一个发出 HTTParty 获取请求的函数。它会引发我需要测试的自定义错误消息。我试图在测试中使用 Webmock 来存根请求,但它引发了<Net::OpenTimeout>。如果 url 是动态构造的,我如何存根 get 请求?

def function(a , b)
# some logic , dynamic url constructed
response = HTTParty.get(url, headers: {"Content-Type" => 
 "application/json"})
if response.code != 200
  raise CustomError.new <<~EOF
    Error while fetching job details.
    Response code: #{response.code}
    Response body: #{response.body}
  EOF
end
JSON.parse(response.body)

为了测试

def test_function
WebMock.stub_request(:get, url).with(:headers => {'Content- 
  Type'=>'application/json'}).to_return(:status => 500)
# HTTParty.stub(get: fake_response)
err = assert_raises CustumError do
   c.function(a , b)
end

【问题讨论】:

  • 什么是# some logic , dynamic url constructed?这些信息可能是解决方案的基础。
  • 网址有一个基本形式,附加了 a 和 b,例如。 example.com/v1/#{a}
  • 你能不能只显示代码,而不是仅仅试图总结代码的作用?我很容易误解该描述,即使我正确解释了它,也许您的代码实际上并没有按照您的想法进行。
  • 正如下面已经回答的那样,一种可能的解决方案可能是将请求 URL 与正则表达式匹配。但在不真正知道您正在生成什么模式的情况下,我无法给出具体答案,也无法验证它是否有效。

标签: ruby minitest httparty webmock


【解决方案1】:

WebMock 允许您使用“通配符匹配”,因此您可以stub requests matching a regular expression:

WebMock.stub_request(:get, /example/).to_return(status: 500)

【讨论】:

  • 我尝试传递正则表达式,但它仍然不起作用..断言是否正确?
  • 尝试从您的assert_raises 中删除块。此外,如果您向 webmock 提供标头,则可能存在其他阻止匹配的标头
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多