0

我的录像机配置是:

VCR.configure do |c|
  c.configure_rspec_metadata!
  c.cassette_library_dir = 'spec/cassettes'
  c.hook_into :webmock
  c.ignore_localhost = true
end

一个测试示例是:

it "creates a build", :vcr => {:cassette_name => "build/feature/create"} do
  visit new_build_path(build)

  fill_in("build_name", :with => "Test Build")
  click_button("Create Build")

  build = Build.first

  page.should have_content("Build was successfully created.")

  current_path.should == build_path(hub)
end

运行此测试时,它会调用几个第 3 方 API,这些 API 会通过 VCR 记录这些请求。我遇到的问题是,VCR 在运行时似乎正在使用来自其他磁带的请求,这导致某些测试出现间歇性故障。我检查了磁带,有时(取决于顺序是如何显示的)所有请求都会被完美地记录和播放。值得注意的是,当整个套件运行时,它们总是在自己运行时工作。我不会在失败的规范之间共享卡带,唯一共享的是对 API 的一些常见请求,我强制对卡带命名以确保它使用正确的卡带。我希望这是有道理的...

我的主要问题是什么可能导致这个问题?使用测试时也可以正常工作,但使用模式record => :new_episodes时却不行。record => :once考虑到这种情况,这可能没问题,但我想确保我没有创建不必要的请求,并且根据我的理解record => :once应该可以工作,因为每个规范的请求都应该被隔离。

我知道如果没有更多信息,这可能很难回答,所以请告诉我是否有帮助。提前致谢!

4

1 回答 1

0

正如你所说,从你提供的一点点信息中很难回答。不过,我可以提供一些帮助解决问题的建议。

  • 您提到您正在使用 capybara JS 驱动程序。Capybara 的 JS 驱动程序是异步的,这意味着您的测试线程可能会在您的应用程序处理特定请求之前继续运行 - 因此,如果测试脚本继续运行并弹出或插入新的 VCR 磁带,然后您的应用程序会发出 HTTP 请求 - - 它可能导致竞争条件。
  • VCR 有一个debug_logger选项,可以让您深入了解 VCR 正在做什么。它可能会回答你的问题。

祝你好运!

于 2013-04-24T06:26:51.453 回答