Rspe c: запустить код очистки перед принудительным завершением? - PullRequest
1 голос
/ 09 января 2020

Я не использую транзакционные тесты. Вместо этого я вручную возвращаю базу данных с помощью DatabaseCleaner после каждого теста:

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

Однако, если я принудительно завершу работу RSpe c, база данных не будет возвращена. Как я могу запустить DatabaseCleaner до принудительного выхода?

1 Ответ

0 голосов
/ 09 января 2020

На самом деле нет надежного способа убрать после форс-тиши. Но вы можете выполнить очистку перед запуском:

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 ловушке.

...