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

时间:2013-03-19 01:01:57

标签: javascript jquery ruby-on-rails rspec capybara

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

最终代码如下所示:

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