【问题标题】:Rspec: run clean up code before force quitting?Rspec:在强制退出之前运行清理代码?
【发布时间】:2020-01-09 19:51:38
【问题描述】:

我没有使用事务测试。相反,我在每次测试后使用 DatabaseCleaner 手动恢复数据库:

after(:each) { DatabaseCleaner.clean_with :truncation }

但是,如果我强制退出 RSpec,数据库不会恢复。如何在强制退出前运行 DatabaseCleaner?

【问题讨论】:

  • 你用的是什么强制退出? CTRL+C? CTRL+\?如果你杀死它过于激进(例如kill -9 作为紧急停止),你将很难终止它,它不可能清理任何东西。
  • Ctrl + C 两次。第一次它告诉我它正在打印摘要(但冻结或花费太长时间),第二次它实际上退出了
  • 第二次中断迫使它放弃正在做的任何事情并硬终止。这可以防止它运行您的清理过程。您要么需要找出导致它停止的原因,要么将其包装在一个可以为您清理的过程中。如果可能的话,将这个after 移动到链中的更早的位置,这样它就可以在任何阻塞它的慢动作之前运行。

标签: ruby-on-rails ruby rspec


【解决方案1】:

确实没有可靠的方法可以在强制执行后进行清理。但是您可以在开始之前进行清理:

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with :truncation
  end
end

如果您担心性能,可以这样做:

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with :truncation if File.exists?('tmp/spec_db_might_be_dirty')
    FileUtils.touch('tmp/spec_db_might_be_dirty')
  end

  config.after(:suite) do
    DatabaseCleaner.clean_with :truncation 
    FileUtils.rm('tmp/spec_db_might_be_dirty')
  end
end

一个特殊的“标记”文件将在套件开始时创建,如果在 DatabaseCleaner 完成工作之前发生强制退出,它将保留在那里。

如果不是强制退出 - 它将在 after 挂钩中删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2012-12-11
    • 2014-10-19
    • 2014-11-06
    • 2015-03-29
    • 2011-02-03
    相关资源
    最近更新 更多