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测试方法吗?
答案 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')
});
});