在我的 Rails 项目中,我使用VCR和 RSpec 来测试与外部 REST Web 服务的 HTTP 交互,该服务只允许每秒调用一次。
到目前为止,这意味着我最终会运行我的测试套件,直到它由于来自 Web 服务的“超出调用次数”错误而失败。不过,在那个阶段,至少有一些磁带被记录下来,所以我只是不断地运行测试套件,直到最终我将它们全部记录下来,并且套件只能使用磁带运行(我的default_cassette_options = { record: :new_episodes }
)。这似乎不是一种最佳的做事方式,特别是如果我发现我以后需要经常重新录制我的磁带,并且我担心不断的呼叫可能会使我进入网络服务的黑名单(没有测试他们有我知道的服务器)。
因此,我最终尝试在调用 Web 服务之前直接将调用sleep(1)
放入我的 Rspecit
块中,然后将这些调用重构到 VCR 配置中:
规范/支持/vcr.rb
VCR.configure do |c|
# ...
c.after_http_request do |request, response|
sleep(1)
end
end
虽然这似乎工作正常,但有没有更好的方法来做到这一点?目前,如果调用没有磁带的外部服务已经是套件中的最终测试,那么套件会不必要地休眠 1 秒。同样,如果测试套件中没有磁带的 2 个 Web 服务调用之间的时间超过一秒,那么就会有另一个不必要的暂停。有没有人制定任何逻辑来测试这些条件,或者有没有办法在 VCR 配置中优雅地做到这一点?