在我的Rails项目中,我使用VCR和RSpec来测试HTTP对外部REST Web服务的交互,该服务仅允许每秒调用一次。使用VCR和RSpec测试受限速的外部API调用
这是什么意思到目前为止,我最终运行我的测试套件,直到它失败,由于从Web服务“超出呼叫次数”错误。然而,在那个阶段,至少有一些录像带被录制下来,所以我只是不断地运行测试套件,直到最终我将它们全部记录下来,套件只能使用盒式录像带(我的default_cassette_options = { record: :new_episodes }
)运行。这看起来并不是一种最佳的做事方式,特别是如果我发现我需要在未来经常重新录制我的磁带盒,并且我担心不断的调用可能会将我带入Web服务的黑名单(没有测试服务器他们有我知道的)。
所以,我结束了直接调用Web服务之前试图把电话在我的Rspec的it
块sleep(1)
制成,然后重构这些调用成录像机配置:
规格/支持/ vcr.rb
VCR.configure do |c|
# ...
c.after_http_request do |request, response|
sleep(1)
end
end
尽管这似乎做工精细,有没有更好的方式来做到这一点?目前,如果对已经没有盒式磁带的外部服务的呼叫是套件中的最终测试,则该套件不必要地睡1秒钟。同样,如果测试套件中两次不带磁带的Web服务调用之间的时间超过一次,那么还有一次不必要的暂停。有没有人做过任何一种逻辑来测试这些条件,还是有办法在VCR配置中优雅地做到这一点?
鉴于积极的速率限制这样的一个链接,我将建立节流权到客户端。据推测,如果它炸毁测试套件,它也可能在生产中爆炸。 – willglynn
+1好点;甚至没有想到这一点。该计划仅适用于每天一次的cron作业调用这些API,但由于在cron期间会有多个调用完成,所以此问题仍然存在。看起来我有一个客户端设计问题来看待。 –