我如何测试(使用 RSpec)HTTP 请求是在 Rails 中发送的(作为单元测试的一部分)?

How can I test (with RSpec) that an HTTP request is send in Rails (as part of an unit test)?

我在网关 class 中获得了这段代码,它向公司内部 API 发出请求。我如何对其进行单元测试?

class XGateway < BaseGateway
  self.target_url = ENV["X_URL"]

  def activate(serial_number:, comment: nil)
    expecting 204 do
      connection.put do |req|
        req.url "/api/v1/hw/#{serial_number}/activate"
        req.params = { comment: comment }
      end
    end
  end

  def deactivate(serial_number:, comment: nil)
    expecting 204 do
      connection.put do |req|
        req.url "/api/v1/hw/#{serial_number}/deactivate"
        req.params = { comment: comment }
      end
    end
  end
end

connection 是一个法拉第请求对象,expecting 是一种让方法知道它期望有效响应的状态的方法。两者都在 XGateway 继承的 BaseGateway 中定义。

现在我需要在这里测试什么(在单元测试的范围内?)

据我了解,对于每种方法:

但是,如何测试是否已发送 http 请求?

通常我使用 VCR 来测试请求和响应。有了这个,您可以记录在您的代码中做出的请求和响应。 VCR 的主要目的是加速您的测试套件,并使其更健壮地应对第三方系统的变化。

在您的情况下,您可以设置单元测试,将参数传递给 activatedeactivate 方法,并根据您期望的输入响应进行测试。

您可以(尽管我不推荐这样做)解析请求 url 所在部分的录像带,并将其与您的期望相匹配。