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 для отладки кода, и когда я отлаживаю код построчно, тесткейс проходит успешно. Я не знаю, почему происходит такое странное поведение

Вернуться на верх