我正在使用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 ,但它没有帮助。关于我的规范中可能缺少哪些内容以使其工作的任何想法?该功能在浏览器中有效;这只是没有通过的测试。
答案 0 :(得分:2)
使用poltergeist驱动程序运行测试时,您的页面实际上是在一个单独的进程中呈现的(即phantomjs进程)。
这意味着如果你的javascript加载任何外部内容,PhantomJS实际上会加载外部内容而不是加载VCR磁带,因为VCR只会影响运行测试的Ruby进程内的HTTP调用。
你应该考虑用Jasmine来测试你的JS,而不是试图用Capybara测试你的JS代码,你将有机会模拟对外部服务的调用。
答案 1 :(得分:0)
初始实现实际上是正确的,但我的JS没有足够的弹性来处理服务器错误。在磁带重新加载之间发出了请求,并且返回了不成功的HTTP状态。
更新JS以处理错误的请求并继续轮询解决了这个问题,最后,JS应该是如何表现的。