В настоящее время я тестирую этот код, используя pytest из Storm_Centre.py.

class Storm_Centre:
    def __init__(self):
        self.storm_list = []
        
    def already_exists(self, name) -> bool:
        for storm in self.storm_list:
            if storm.name == name:
                return True
        return False

Этот код использует код из Storm.py

from abc import ABC, abstractmethod


class Storm(ABC):
    def __init__(self, name, wind_speed):
        self.name = name
        self.wind_speed = wind_speed
        super().__init__()

    @abstractmethod
    def calculate_classification(self):
        pass

    @abstractmethod
    def get_advice(self):
        pass

Я тестирую код в test_storm.py, используя следующий код:

import pytest
from Storm import Storm
from Storm_Centre import Storm_Centre

def test_already_exists():
    s1 = Storm('Jeff', 10)
    c1 = Storm_Centre()
    c1.storm_list.append(s1)
    assert(c1.already_exists('Jeff') == True)
    assert(c1.already_exists('Dave') == False)

При запуске теста я получаю сообщение об ошибке «Не удается создать экземпляр абстрактного класса». Если кто-то может помочь решить эту ошибку, мы будем очень признательны. Спасибо!

-1
Reina297 24 Май 2023 в 20:56
1
Вы не можете создать экземпляр абстрактного класса, он абстрактен.
 – 
jonrsharpe
24 Май 2023 в 21:16

1 ответ

Абстрактные базовые классы довольно легко "разрушить" в целях тестирования.

>>> Storm.__abstractmethods__
frozenset({'calculate_classification', 'get_advice'})
>>> Storm("Jeff", 10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Storm with abstract methods calculate_classification, get_advice
>>> Storm.__abstractmethods__ = frozenset()
>>> Storm("Jeff", 10)
<__main__.Storm object at 0x1011d0f50>

Таким образом, чтобы избежать необходимости определять конкретный подкласс для создания экземпляра, вы можете просто установить для атрибута __abstractmethods__ пустой список, набор и т. д., и попытка создать его экземпляр будет успешной (поскольку он больше не сообщает о каких-либо методах, которые должен быть переопределен в первую очередь).

0
chepner 24 Май 2023 в 23:59