6

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

我最初尝试在 Capybara 验收测试中使用 Timecop gem 来快进时间,但这没有用。然而,当我添加一个 sleep(45) 时,它确实有效。显然,我不能在我的规范中使用 sleep(45) 3 次,但很高兴知道什么是有效的,这样我就可以用更快的方法接近它。

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

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

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

同样,当延迟被移除时,我的规格通过了,但我需要延迟。我怎样才能在我的 Capybara 测试中解决这个问题?还是我需要用 Jasmine 测试该方法?

4

1 回答 1

2

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

最终代码如下所示:

$('.votable').one('click'). '.vote', function() {
  $('.post-vote').
   <% unless Rails.env.test? %>
     delay(45000).
   <% end %>
   queue(function() {
     $(this).dialog('open')
    });
 });
于 2013-03-21T21:54:37.003 回答