如何在Capybara验收测试中存根延迟JavaScript延迟?

Jes*_*ung 6 javascript jquery rspec ruby-on-rails capybara

My Rails应用程序包含一个JavaScript模式,在用户单击链接后45秒弹出.结果,我的验收测试,在没有延迟时过去通过,都失败了.

我最初尝试使用Timecop gem在我的Capybara验收测试中快进时间,但这不起作用.然而,当我加入睡眠(45)时,确实有效.很显然,我不能有睡眠(45)在我的规格的3倍,但它的好,知道这是什么工作,所以我可以更接近与更快的方法.

我从实验中得出的结论是Ruby记录时间和Javascript跟踪时间,Timecop是快速转发Ruby时间而不是Javascript时间.有没有办法在我的Capybara测试中快进45秒,以便我的Javascript事件触发?

这是导致我的测试失败的函数:

        $('.votable').one('click', '.vote', function() {
          $('.post-vote').
            delay(45000).
            queue(function() {
                $(this).dialog('open')
            });
        });
Run Code Online (Sandbox Code Playgroud)

再次,当延迟被删除,我的规格通过,但我需要延迟.我怎样才能在我的Capybara测试中将其排除在外?或者我需要用Jasmine测试方法吗?

Jes*_*ung 2

最后,解决这个问题的最简单的解决方案是使我的 .js 文件成为 .js.erb 文件,然后使用分支仅包含非测试环境中的延迟。并不理想,但所有其他解决方案都涉及更多,我绝对不愿意为了让我的视图代码看起来漂亮而将我的测试速度放慢 45 秒。

最终代码如下所示:

$('.votable').one('click'). '.vote', function() {
  $('.post-vote').
   <% unless Rails.env.test? %>
     delay(45000).
   <% end %>
   queue(function() {
     $(this).dialog('open')
    });
 });
Run Code Online (Sandbox Code Playgroud)