Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用多个VCR磁带测试javascript刷新_Ruby On Rails_Rspec_Capybara_Poltergeist_Vcr - Fatal编程技术网

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

Ruby on rails 使用多个VCR磁带测试javascript刷新,ruby-on-rails,rspec,capybara,poltergeist,vcr,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 h

我正在使用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

第一个
有内容
成功,但第二个没有成功。Capybara应该等待任何异步调用返回并更新DOM,以便这些断言通过。我尝试了
使用_wait _time
强制断言在ajax调用返回后等待很长时间,但没有帮助。关于我的规范中可能缺少什么东西来实现这一点,有什么想法吗?该功能在浏览器中不起作用;只是测试没有通过。

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

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


<>而不是尝试用Capybara测试你的JS代码,你应该考虑用类似的方法测试你的JS,在那里你有机会调用外部服务。

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


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

对外部服务的调用是通过Rails应用程序进行的,JS正在访问RESTful API。我想测试整个堆栈,这就是为什么我宁愿使用Rails应用程序的API并在后端使用VCR模拟服务的原因。这就是问题所在;当JS调用API时,根据规范,它应该已经更改了磁带(因为JS正在调用正在运行的Rails应用程序的测试版本),但我仍然得到了响应,就好像加载了第一个磁带一样。您如何协调JS代码中的AJAX调用与磁带的更改?AJAX调用很可能发生在您更改磁带之后/之前,因为它们发生在一个单独的进程中。可能值得在磁带更改和控制器中添加一些时间戳日志,以查看何时发出请求。查看AJAX响应,他们报告了500个错误,这就是测试失败的原因。查看测试日志并没有透露任何其他细节。AJAX位每5秒重试一次,因此即使它在第一次尝试时没有捕捉到正确的响应,它最终也会。我不认为是卡带切换导致了错误,因为在没有卡带的情况下发出请求时,录像机通常声音很大。不管它值多少钱,第一页.should断言确实通过了。