Почему тест выдает не верный id?

Рейтинг: 0Ответов: 1Опубликовано: 09.03.2023

Пытаюсь тестировать класс Contactor. Тесты проваливаются.
Создаю один экземпляр класса, вызываю метод test_get_id, должен возвращать 1, а возвращает 2.
Но при этом все тесты проходят если убрать метод test_get_characteristics.

class User(ABC):
    id: int = 0

    global characteristic_list
    characteristic_list = []

    count = 0

    @classmethod
    def incr(self):
        self.count += 1
        return self.count

    def __init__(self):
        self.id = self.incr()

    def get_id(self):
        return self.id

    def add_characteristic(self, name, type, question):
        characteristic_list.append(Characteristic(name, type, question))

    def get_characteristics(self):
        return characteristic_list


class Contactor(User):
    pass


### test

class TestContractor(unittest.TestCase):
    def setUp(self):
        self.contactor1 = Contactor()


    def test_get_id(self):
        self.assertEqual(self.contactor1.get_id(), 1)


    def test_get_characteristics(self):
        self.contactor1.add_characteristic("Имя", "str", "Как тебя зовут?")
        self.contactor1.add_characteristic("Фамилия", "str", "Какая у тебя фамилия?")
        self.contactor1.add_characteristic("Возраст", "int", "Сколько тебе лет?")

        self.assertEqual(len(self.contactor1.get_characteristics()), 3)

Подскажите, почему так происходит? Как мне от этого избавиться?
Такое ощущение, что конструктор вызывается по несколько раз.

Ответы

▲ 3Принят

Метод incr вызывается каждый раз при создании экземпляра класса. А setUp вызывается для каждого теста. Т.е. создает self.contactor1 столько раз, сколько есть тестов в классе TestContractor. Вы не можете для такого класса проверять статично id в тестах, если их больше одного, если Contactor создается под каждый тест. Надо использовать метод setUpClass. Он выполняется один раз для всех тестов в тестируемом классе.

class TestContractor(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.contactor1 = Contactor()

    def test_get_id(self) -> None:
        self.assertEqual(self.contactor1.get_id(), 1)

    def test_get_characteristics(self) -> None:
        self.contactor1.add_characteristic("Имя", "str", "Как тебя зовут?")
        self.contactor1.add_characteristic("Фамилия", "str", "Какая у тебя фамилия?")
        self.contactor1.add_characteristic("Возраст", "int", "Сколько тебе лет?")

        self.assertEqual(len(self.contactor1.get_characteristics()), 3)