【发布时间】:2012-10-01 14:15:47
【问题描述】:
在我的 Rails 项目中,我使用 VCR 和 RSpec 来测试与外部 REST Web 服务的 HTTP 交互,该服务只允许每秒调用一次。
到目前为止,这意味着我最终会运行我的测试套件,直到它由于来自 Web 服务的“超出调用次数”错误而失败。不过在那个阶段,至少有一些磁带被记录下来,所以我只是不断地运行测试套件,直到最终我把它们全部记录下来,并且套件可以只使用磁带运行(我的 default_cassette_options = { record: :new_episodes })。这似乎不是一种最佳的做事方式,特别是如果我发现我以后需要经常重新录制我的磁带,并且我担心不断的呼叫可能会使我进入网络服务的黑名单(没有测试他们有我知道的服务器)。
所以,我最终尝试在调用 Web 服务之前直接在我的 Rspec it 块中调用 sleep(1),然后将这些调用重构到 VCR 配置中:
spec/support/vcr.rb
VCR.configure do |c|
# ...
c.after_http_request do |request, response|
sleep(1)
end
end
虽然这似乎工作正常,但有没有更好的方法来做到这一点?目前,如果调用没有磁带的外部服务已经是套件中的最终测试,那么套件会不必要地休眠 1 秒。同样,如果测试套件中没有磁带的 2 个 Web 服务调用之间的时间超过一秒,那么就会有另一个不必要的暂停。有没有人为这些条件制定了任何逻辑来测试,或者有没有办法在 VCR 配置中优雅地做到这一点?
【问题讨论】:
-
考虑到像这样激进的速率限制,我会直接在客户端中构建节流。据推测,如果它炸毁了测试套件,它也可能在生产中炸毁。
-
+1 好点;甚至没有想到这一点。该计划仅是每天在 cron 作业中调用这些 API 一次,但由于在 cron 期间将完成多次调用,因此问题仍然存在。看起来我有一个客户端设计问题要查看。
标签: ruby-on-rails api rspec rspec2 vcr