Тестирование ручных транзакций внутри юнит-тестов Django
Как вы тестируете код, который отключает автокоммит и использует точки сохранения, внутри юнит-теста Django?
Класс unitjt по умолчанию Django охватывает все тесты внутри @atomic
decorator, который обычно является именно тем, что вам нужно, чтобы гарантировать, что база данных sqlite будет сброшена между тестами. Тем не менее, любой код, который касается transaction.set_autocommit()
из теста выдает ошибку:
TransactionManagementError: This is forbidden when an 'atomic' block is active.
даже если он отлично работает за пределами unittest.
Как временно отключить автоматическую фиксацию транзакции в модульном тесте, чтобы можно было проверить фиксацию вручную?
1 ответ
Использование TransactionTestCase
:
TransactionTestCase
а такжеTestCase
идентичны, за исключением способа сброса базы данных в известное состояние и возможности тестового кода для проверки эффектов фиксации и отката: ATransactionTestCase
сбрасывает базу данных после запуска теста, обрезая все таблицы.TransactionTestCase
может вызывать коммит и откат и наблюдать влияние этих вызовов на базу данных.