使用Rspec + Timecop + Capybara + Capybara Webkit的集成规范中的Capybara :: FrozenInTime错误

hsg*_*ert 10 rspec capybara ruby-on-rails-3 capybara-webkit timecop

我在使用rspec,capybara,capybara-webkit和timecop看到一些集成规范中的错误.

Capybara::FrozenInTime:
   time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead
Run Code Online (Sandbox Code Playgroud)

我知道冻结时间的唯一宝石是Timecop,但我没有在失败的测试用例中使用它.

由于错误只是偶尔发生,我甚至无法知道它在改变之后是否消失.

Mat*_*sel 10

错误消息的结尾包含解决方案:

考虑使用时间旅行而不是

只需Timecop.freeze改为Timecop.travel. Timecop.freeze 打破了Capybara的自动等待功能.

另外,我会Timecop.return在一个后块中调用,因为它将与最近的旅行块相关联:

after :each do
  Timecop.return
end
Run Code Online (Sandbox Code Playgroud)


hsg*_*ert 5

我找到的解决方案是添加

before :each do
  Timecop.return
end
Run Code Online (Sandbox Code Playgroud)

在spec_helper.rb中.

这样我们就保证在每次测试之前不会冻结时间,尽管只有那些有问题的是在不同的webdriver中执行的rack-test.就我而言capybara-webkit.

  • 您应该在spec_helper中使用`Timecop.safe_mode = true`启用安全模式.这将使得Timecope.freeze需要一个块,这意味着时间将被解冻. (3认同)