У меня странная проблема, которую я нигде не могу найти.
Я использую Resque в проекте вместе с DatabaseCleaner для очистки между тестами. Наш набор тестов должен на самом деле использовать обычные resque / redis (поэтому мы не можем использовать Monkeypatching ResqueSpec, поскольку он обходит использование Resque / Redis).
Мы пытались использовать стратегию DBCleaner :transaction
, но поскольку Resque порождает свое собственное соединение ActiveRecord after_fork (см. Код ниже), транзакции не будут работать, так как mysql позволяет видеть транзакции только на одном соединении .
Resque делает это:
Resque.after_fork { ActiveRecord::Base.establish_connection if defined?(ActiveRecord) }
Самое простое решение - использовать очиститель DB со стратегией :truncation
. Мы хотели бы иметь возможность включать :truncation
только при использовании Resque и затем возвращаться к :transaction
при запуске несвязанных спецификаций.
Часть хитрости заключается в том, что наш сотрудник Resque запущен и работает в течение срока действия спецификаций. Он запускает работника при запуске тестовых спецификаций, а затем просто приостанавливает рабочий процесс после того, как спецификация, отмеченная @resque
, выполняется через набор Before
/ After
перехватчиков.
Итак, вопрос в том, как заставить DatabaseCleaner эффективно переключать все активные подключения к ActiveRecord DB для использования правильной стратегии очистки? DatabaseCleaner предоставляет методы переключения стратегий для различных спецификаций, но, похоже, он не переключается на все соединения, а только на основное соединение AR-процесса Rails.
Опять же, решение на данный момент заключается в использовании :truncation
везде. Просто хотел узнать, есть ли у кого-нибудь мысли о том, как обойти это.