Я бы хотел исправить некоторые внешние пакеты, используемые в модуле, который я тестирую.Пожалуйста, взгляните на мой код:
src / Notifiers.py
from abc import ABC, abstractmethod
from pathlib import PureWindowsPath
from smtplib import *
from datetime import datetime
from email.mime.text import MIMEText
import logging
import schedule
class Notifier(ABC):
def __init__(self, name):
self._logger = logging.getLogger(__name__)
self._name = name
@abstractmethod
def send_notification(self, msg):
pass
def set_logger(self, root_name):
my_logger_name = root_name + '.' + self._name
self._logger = logging.getLogger(my_logger_name)
self._logger.setLevel(logging.DEBUG)
class EmailNotifier(Notifier):
def __init__(self, name, host, port, user, passwd, receivers):
super().__init__(name)
self._host = host
self._port = port
self._username = user
self._password = passwd
self._receivers = receivers
def send_notification(self, lines):
self._logger.debug('Rozpoczynam wysylanie maila')
msg = MIMEText('\n'.join(lines))
msg['Subject'] = 'SIMail powiadomienie'
msg['From'] = 'SIMail kontrola routerow'
msg['To'] = ", ".join(self._receivers)
msg['Date'] = datetime.now().strftime('%a, %b %d, %Y at %I:%M %p')
try:
smtp_obj = SMTP(self._host,
self._port)
smtp_obj.starttls()
smtp_obj.login(self._username,
self._password)
smtp_obj.send_message(msg)
self._logger.info('Sent notification emails')
except SMTPRecipientsRefused:
print("Nobody was an email sent to")
except SMTPHeloError:
print("Server didnt respond for hello")
except SMTPSenderRefused:
print("Server refused sender")
Приведенный выше код содержит модуль, который я хотел бы проверить.Обратите внимание, что EmailNotifier использует библиотеки, такие как MIMEText и SMTP, которые мне нужно будет смоделировать во время тестов.
Теперь я покажу вам мой тестовый пример: tests / unit / Notifiers_test.py
from mock import patch
from unittest import TestCase
from Notifiers import *
class EmailNotifierTest(TestCase):
@patch('Notifiers.email.mime.text.MIMEText')
@patch('Notifiers.smtplib.SMTP')
def test_send_notification(self, mock_smtp, mock_mime):
"""
Case:
Send email notification
Excpected:
EmailNotifier cannot crush
"""
mock_smtp.side_effect = lambda: None
name = 'test_name'
host = 'test_host'
port = 123
user = 'test-user'
passwd = 'test-passwd'
receivers = ('abc@def.gh', 'ijk@lmn.op')
notifier = EmailNotifier(name, host, port, user, passwd, receivers)
lines = ('1. This is line number one', '2. This is line number two')
notifier.send_notification(lines)
mock_mime.assert_called_with('\n'.join(lines))
Проблема в том, что мне нужно установить патч MIMEText
, используемый в EmailNotifier
, который я тестирую в другом модуле, то есть Notifiers_test
.Но когда я пытаюсь исправить, я получаю сообщение об ошибке:
F Notifiers_test.py:7 (EmailNotifierTest.test_send_notification) ........ \ AppData \ Local \ Programs \ Python \Python37-32 \ lib \ site-packages \ mock \ mock.py: 1297: в исправленном arg = исправление. введите () ........ \ AppData \ Local \ Programs \ Python \Python37-32 \ lib \ site-packages \ mock \ mock.py: 1353: в введите self.target = self.getter () ........ \ AppData \ Local \ Programs \Python \ Python37-32 \ lib \ site-packages \ mock \ mock.py: 1523: in getter = lambda: _importer (target) ........ \ AppData \ Local \ Programs \ Python \ Python37-32 \lib \ site-packages \ mock \ mock.py: 1210: в _importer thing = _dot_lookup (thing, comp, import_path)
thing =, Comp = 'smtplib' import_path = 'Notifiers.EmailNotifier.smtplib '
def _dot_lookup(thing, comp, import_path):
try:
return getattr(thing, comp)
except AttributeError:
__import__(import_path)
E ModuleNotFoundError: Нет модуля с именем' Notifiers.EmailNotifier ';«Уведомители» - это не пакет
........ \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ mock \ mock.py: 1199: ModuleNotFoundError
Я попытался пропустить Notifiers
в моем патче src, но тогда мои объекты вообще не были исправлены.Можете ли вы сказать мне, как это сделать правильно?Я использую PyCharm и src установлен в качестве исходного каталога.
Я также прикрепляю свое дерево каталогов: