我如何测试(使用 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 请求
- 在满足期望时测试正确的行为(响应的状态代码为 204)
- 测试未满足期望时的正确行为(响应的状态代码不同于 204)
但是,如何测试是否已发送 http 请求?
通常我使用 VCR 来测试请求和响应。有了这个,您可以记录在您的代码中做出的请求和响应。 VCR 的主要目的是加速您的测试套件,并使其更健壮地应对第三方系统的变化。
在您的情况下,您可以设置单元测试,将参数传递给 activate
和 deactivate
方法,并根据您期望的输入响应进行测试。
您可以(尽管我不推荐这样做)解析请求 url 所在部分的录像带,并将其与您的期望相匹配。
我在网关 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 请求
- 在满足期望时测试正确的行为(响应的状态代码为 204)
- 测试未满足期望时的正确行为(响应的状态代码不同于 204)
但是,如何测试是否已发送 http 请求?
通常我使用 VCR 来测试请求和响应。有了这个,您可以记录在您的代码中做出的请求和响应。 VCR 的主要目的是加速您的测试套件,并使其更健壮地应对第三方系统的变化。
在您的情况下,您可以设置单元测试,将参数传递给 activate
和 deactivate
方法,并根据您期望的输入响应进行测试。
您可以(尽管我不推荐这样做)解析请求 url 所在部分的录像带,并将其与您的期望相匹配。