📜  webmock stub_request 不工作 - Ruby (1)

📅  最后修改于: 2023-12-03 15:35:40.456000             🧑  作者: Mango

WebMock stub_request 不工作 - Ruby

介绍

WebMock 是一个用来模拟 HTTP 请求和响应的 Ruby 库,它可以用来测试与其他网络服务的交互,也可以用来在开发中模拟外部服务的行为。 但有时候,你会遇到 WebMock 的 stub_request 不工作的问题,这篇文章将向你介绍一些常见的问题和解决方案。

常见问题
1. 没有启用 WebMock

如果你没有像下面这样在程序中启用 WebMock,那么 WebMock 的 stub_request 方法将不起作用。

require 'webmock'
WebMock.enable!
2. 超过了 stub_request 的优先级

WebMock 的 stub_request 具有优先级,如果你已经使用了一个较低优先级的 stub_request 来创建一个与请求相匹配的响应,那么后来使用更高优先级的 stub_request 将无效。

stub_request(:get, "http://example.com/").
  to_return(status: 200, body: "", headers: {})

stub_request(:get, "http://example.com/").
  to_return(status: 404, body: "", headers: {})

在上面的例子中,第一个 stub_request 的优先级低于第二个,因此第二个将会覆盖第一个。

3. 不正确的请求匹配

当 stub_request 方法的第一个参数与请求的地址或 HTTP 方法不匹配时,该方法将无效。

# 匹配 GET 请求
stub_request(:get, "http://example.com/").to_return(status: 200)

# 不匹配 POST 请求
stub_request(:post, "http://example.com/").to_return(status: 200)
4. 未正确设置响应

当调用 stub_request 的 to_return 方法时,必须提供有效的响应信息。如果 to_return 的参数未设置或不完整,则该方法将无效。

# 正确设置了响应
stub_request(:get, "http://example.com/").to_return(status: 200, body: "")

# 未设置响应
stub_request(:get, "http://example.com/").to_return

# 不完整的响应信息
stub_request(:get, "http://example.com/").to_return(status: 200)
5. 拦截的请求未发送

当调用 stub_request 方法时,要确保实际发送了需要拦截的请求。如果 stub_request 未在请求发送之前被调用,该方法将无效。

# 正确
stub_request(:get, "http://example.com/").to_return(status: 200, body: "")
response = Net::HTTP.get_response(URI('http://example.com/'))

# 错误:未发送请求
stub_request(:get, "http://example.com/").to_return(status: 200, body: "")
解决方案

解决 WebMock 的 stub_request 不工作的问题,你应该:

  1. 确保启用了 WebMock。
  2. 检查 stub_request 的优先级。
  3. 检查请求匹配是否正确。
  4. 确定响应是否正确设置。
  5. 确保拦截的请求已发送。

如果你仍然无法解决问题,可以查看 WebMock 的文档,或在 Stack Overflow 上寻求帮助。

参考