【发布时间】:2016-03-04 20:00:23
【问题描述】:
如果完成时间超过 n 秒,我想失败(或继续)RSpec 测试。我将其用作调试应用程序在测试期间停止的位置的一种方式。
-
我需要将测试包装在一个事务中。 我尝试创建一个
Timeout块,但没有清理数据库,并且一个线程处于打开状态。也许 database_cleaner 可以在这里提供帮助... - 理想情况下,我想用自定义消息替换 Capybara 错误(见下文),例如
'Forced Timeout'
我知道将fail 放入测试中,但它仅在读取该行时才有效。相反,如果一个测试在同一行上持续了 10 秒,我希望它通过失败或调用某个 continue 方法移动到下一个测试。
Capybara 失败消息示例:
1) Exercise Login page - log in as user type
Failure/Error: fill_in "Username", with: @user.name
Capybara::ElementNotFound:
Unable to find field "Username"
【问题讨论】:
-
您不应该在测试中实施超时,而是在任何需要很长时间的情况下实施。因此,如果您长时间运行的进程正在尝试连接到某个东西,那么您的 HTTP 客户端(或其他任何东西)应该检测它自己的超时。
-
@Anthony 我同意你的观点,但在这一点上,我不确定什么需要这么长时间。例如,我在午餐时间运行我的套件,但在 2 分钟后停止了 10 次测试。在这种情况下,记录的最后一件事是
ROLLBACK——没有什么可以说明回滚是如何崩溃的。 -
在进行 capybara 规范时,您希望使用截断而不是事务 - 特别是当您使用 webkit 或 selenium 之类的 javascript 驱动程序时。 github.com/jnicklas/capybara#transactions-and-database-setup
-
此外,如果您使用 Webkit、Poltergeist 或 Selenium,您可以在驱动程序级别设置超时,请参阅每个驱动程序的文档。
-
@max 我不知道 Poltergeist 或 Capybara Webkit 有超时方法。我会检查文档,谢谢。
标签: ruby-on-rails ruby rspec rspec3