В настоящее время я тестирую этот код, используя 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 ответ
Абстрактные базовые классы довольно легко "разрушить" в целях тестирования.
>>> 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__
пустой список, набор и т. д., и попытка создать его экземпляр будет успешной (поскольку он больше не сообщает о каких-либо методах, которые должен быть переопределен в первую очередь).
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.