0

我正在使用 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,以便这些断言通过。我试图在 ajax 调用返回后using_wait_time强制断言等待很长时间,但这没有帮助。关于我的规范中可能缺少什么来完成这项工作的任何想法?该功能在浏览器中运行;只是没有通过的测试。

4

2 回答 2

2

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

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

与其尝试使用 Capybara 测试您的 JS 代码,不如考虑使用Jasmine之类的东西测试您的 JS ,您将有机会模拟对外部服务的调用。

于 2013-08-26T23:30:33.777 回答
0

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

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

于 2013-10-03T14:54:05.277 回答