Python TDD утверждения assert не работают так, как я думал - PullRequest
1 голос
/ 07 марта 2020

Я просто не понимаю, почему это происходит. Когда я запускаю свое утверждение, кажется, что каждый тест не создает свой собственный объект. поэтому, когда я добираюсь до последнего утверждения assert, тест не пройден, потому что другое утверждение все еще находится в списке Любая помощь будет велика, спасибо. Код моего класса:

from datetime import date

class Transaction():
    """
    Transaction
    """
    balance = 0.0
    timestamp = date.today()
    def __init__(self, amount, dt=None):
        self.balance = amount
        self.transactions = []
        if dt is None:
            self.timestamp = date.today()
        else:
            self.timestamp = dt
    def __repr__(self):
        return '{self.__class__.__name__}({self.balance:,.2f}, {self.timestamp})'.format(self=self)
    def __str__(self):
        return f'{self.timestamp}: ${self.balance:,.2f}'

class Account():
    """
    Account Class
    """
    balance = 0.0
    transaction = Transaction(balance)
    def __init__(self):
        self.balance = 0.0
    def deposit(self, amount):
        self.balance += +amount
        self.transaction.transactions.append(+amount)
    def withdraw(self, amount):
        self.balance -= amount
        self.transaction.transactions.append(-amount)
    def get_balance(self):
        if len(self.transaction.transactions) < 1:
            return 0
        return sum(self.transaction.transactions)

Мой код для pytest:

def test_append_transaction():
    account = Account()
    account.deposit(200)
    assert account.transaction.transactions == [200]

def test_deposit():
    user = Account()
    user.deposit(300)
    assert user.balance == +300.00

def test_append_withdraw():
    account = Account()
    account.withdraw(50)
    assert account.transaction.transactions == [-50]

def test_withdraw():
    account = Account()
    account.withdraw(50)
    assert account.balance == -50.0

Image of my pytest

1 Ответ

2 голосов
/ 07 марта 2020

Ваши тесты дают сбой, потому что ваш код неправильный - то есть они дают сбой, потому что вы написали свои тесты правильно, таким образом, который способен обнаруживать ошибки, и они обнаружили ошибку в вашем коде.

Да, каждая тестовая функция создает новый экземпляр Account, как вы можете ясно увидеть в самих тестовых функциях. Однако каждый экземпляр Account не имеет своего собственного отдельного экземпляра Transaction, поскольку вы сделали этот атрибут класса вместо атрибута экземпляра.

Чтобы исправить ошибку в своем классе Account, вам следует инициализируйте

        self.transaction = Transaction(self.balance)

в методе __init__, чтобы каждый экземпляр Account имел ссылку на отдельный экземпляр Transaction.

...