Невозможно исправить пакет, использованный в другом модуле - PullRequest
0 голосов
/ 14 мая 2019

Я бы хотел исправить некоторые внешние пакеты, используемые в модуле, который я тестирую.Пожалуйста, взгляните на мой код:

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 установлен в качестве исходного каталога.

Я также прикрепляю свое дерево каталогов:

Directories tree

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...