使用多个VCR磁带测试javascript刷新

时间:2013-08-26 22:43:46

标签: ruby-on-rails rspec capybara poltergeist vcr

我正在使用Capybara和Poltergeist来测试使用setTimeout定期刷新页面内容的索引页面。基于外部服务,页面内容在三种状态之间转换,我为每种状态都有一个盒式磁带。

我正在尝试使用以下代码测试刷新:

VCR.use_cassette 'object_new' do
  visit index_path
  page.should have_content 'New'
end

VCR.use_cassette 'object_running' do
  page.should have_content 'Running'
end

VCR.use_cassette 'object_complete' do
  page.should have_content 'Complete'
end

第一个have_content成功,但第二个没有成功。 Capybara应该等待任何异步调用返回并更新DOM,以便这些断言通过。我已经尝试using_wait_time强制断言在ajax调用返回后等待 long ,但它没有帮助。关于我的规范中可能缺少哪些内容以使其工作的任何想法?该功能在浏览器中有效;这只是没有通过的测试。

2 个答案:

答案 0 :(得分:2)

使用poltergeist驱动程序运行测试时,您的页面实际上是在一个单独的进程中呈现的(即phantomjs进程)。

这意味着如果你的javascript加载任何外部内容,PhantomJS实际上会加载外部内容而不是加载VCR磁带,因为VCR只会影响运行测试的Ruby进程内的HTTP调用。

你应该考虑用Jasmine来测试你的JS,而不是试图用Capybara测试你的JS代码,你将有机会模拟对外部服务的调用。

答案 1 :(得分:0)

初始实现实际上是正确的,但我的JS没有足够的弹性来处理服务器错误。在磁带重新加载之间发出了请求,并且返回了不成功的HTTP状态。

更新JS以处理错误的请求并继续轮询解决了这个问题,最后,JS应该是如何表现的。