【问题标题】:How to stub JavaScript delay in Capybara acceptance tests?如何在 Capybara 验收测试中存根 JavaScript 延迟?
【发布时间】:2013-03-19 01:01:56
【问题描述】:

我的 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 测试该方法吗?

【问题讨论】:

  • 你能让延迟的值动态化吗?而不是等待 45k ms,您可以在您的测试环境中将其设置为 50 ms;更合理的时间。
  • @Deefour 您的意思是将延迟期存储在一个变量中,然后在我的规范中重新定义该变量?听起来不错,你能举个例子吗?

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


【解决方案1】:

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

最终代码如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多