Django TestCase не откатывает БД при отказе атомарной транзакции
Мне нужна помощь в написании модульного теста, который тестирует атомарные транзакции
Я просто пишу код, который переводит деньги со счета отправителя на счет получателя, уменьшая сумму денег у отправителя и добавляя ее у получателя. Я хочу запустить код в атомарной транзакции, потому что я хочу, чтобы все операции были либо успешными, либо неудачными. Я хочу написать тестовый пример, который проверит, что если функция пополнения счета не сработает, то снятие средств также должно быть откатано, а баланс отправителя должен остаться прежним.
Проблема в том, что тест не срабатывает, так как показывает, что баланс отправителя уменьшается, хотя он должен быть свернут.
.
Есть помощь?
вот небольшой фрагмент того, чего я хочу достичь
import pytest
from cards.models import Card, Account
from unittest.mock import patch
def perform_atomic(txn, sender_account, receiver_account, amount):
try:
with transaction.atomic():
sender_account.balance -= 1000
sender_account.save()
receiver_account.deposit(amount)
except Exception as error:
txn.status = Transaction.TRANSACTION_STATUS_FAILED
txn.save()
logger.error(f"Failed Action. Reason[{error}]", exc_info=True)
raise error
# Test case
@patch.object(Account, "deposit")
def test_atomicity_when_deposit_fails(self, deposit_mock):
deposit_mock.side_effect = ValidationError("deposit failed")
self.sender_account.balance = 300.0
self.sender_account.save()
# Balance before attempting to transfer
before_sender_balance = self.sender_account.balance
with pytest.raises(ValidationError, match="deposit failed"):
perform_atomic(self.transaction, self.sender_account, self.receiver_account, self.amount)
self.sender_account.refresh_from_db()
# Balance after attempting to transfer
after_sender_balance = self.sender_account.balance.amount
# assert that the sender balanc didn't change
assert before_sender_balance == after_sender_balance
Я пытался использовать TransactionTestCase вместо TestCase, но безрезультатно. Я использую VS code для отладки кода, и когда я отлаживаю код построчно, тесткейс проходит успешно. Я не знаю, почему происходит такое странное поведение