1

我的一些功能规格间歇性地失败了。我们的规格将基线设置为过去。我发现了以下内容:

  • 抛出的错误是:

UncaughtThrowError(未捕获的抛出:warden):

[#B3FBC85E07A6] 设计 (4.3.0) lib/devise/hooks/timeoutable.rb:26:in 'throw'

[#B3FBC85E07A6] 设计 (4.3.0) lib/devise/hooks/timeoutable.rb:26:in 'block in'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/hooks.rb:15:in 'block in _run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in 'each'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/manager.rb:52:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/proxy.rb:180:in 'set_user'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/test/helpers.rb:21:in 'block in login_as'

[#B3FBC85E07A6]warden (1.2.7) lib/warden.rb:40:in 'block in test_mode!'

[#B3FBC85E07A6] 守望者 (1.2.7) lib/warden/hooks.rb:15:in 'block in _run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in 'each'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/hooks.rb:10:in '_run_callbacks'

[#B3FBC85E07A6] 监狱长 (1.2.7) lib/warden/manager.rb:52:in '_run_callbacks'

...

  • 仅在我使用 Timecop 时失败

查看错误(在 timeoutable.rb 中引发了异常)和 Timecop 的常见用法,我认为这是负责任的 - 但我无法解释它为什么会发生,也无法解释为什么它是间歇性的。

这是一个示例代码,可以进一步解释该问题:

Timecop.travel(10.weeks.from_now) do
     sign_in(user)
     visit some_path
     expect(page).to have_title('something')
     # ... and more
end

请注意,尽管在时间旅行后登录,但有时仍会出现错误。

一切正常,实际上这个测试(和其他几个)最多每 50 多次失败 1 次。

任何帮助深表感谢。提前致谢。

编辑:根据屏幕截图,访问页面时发生错误。此屏幕截图来自 Capybara 失败,就在我尝试访问页面之后。未捕获的异常

4

1 回答 1

0

我猜你得到的错误是由你访问它时页面问题的二次请求引起的。在Timecop重置时间和清理测试之间有一小段时间,来自页面的请求可能会到达服务器并使用无效的会话 cookie 进行处理(由于服务器时间已更改)。一旦您确认该页面在您访问它时发出了额外的请求,您可以采取一些措施来解决该错误。

  1. 为额外的请求添加额外expect的测试

  2. 为特定测试设置Capybara.raise_server_errors = false,因此服务器错误被忽略

  3. request.env["devise.skip_timeout"] = true在特定测试期间实现一种设置方式(可能是中间件)

  4. 使用非块版本,Timecop.travel然后为特定测试调用Timecop.returnappend_after。这应该将调用移动return到 Capybara 等待所有请求完成之后——尽管可能会对测试清理产生潜在的副作用,但不能 100% 确定这会稳定。

于 2017-10-13T16:07:14.097 回答