DatabaseCleaner с Resque - PullRequest
       19

DatabaseCleaner с Resque

2 голосов
/ 12 августа 2011

У меня странная проблема, которую я нигде не могу найти.

Я использую 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 везде. Просто хотел узнать, есть ли у кого-нибудь мысли о том, как обойти это.

...