assert_called () вызывает исключение, хотя класс был создан - PullRequest
0 голосов
/ 09 января 2020

Используя этот ответ в качестве модели, я тестирую следующий метод, который создает экземпляр класса (EmailMultiAlternatives):

admintools / emailer.py

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags


def send_email(template_path, context, subject_line, from_email, to=[], cc=[], bcc=DEFAULT_BCC_EMAILS):
    msg_html = render_to_string(template_path, context)
    msg_plain = strip_tags(msg_html)
    email = EmailMultiAlternatives(subject_line, msg_plain, from_email, to, cc=cc, bcc=bcc)
    email.attach_alternative(msg_html, "text/html")
    email.send()

с использованием test.py :

from unittest.mock import patch

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.test import TestCase

from admintools.emailer import send_email


class EmailerTestCase(TestCase):

    @patch('django.core.mail.EmailMultiAlternatives')
    def test_send_email(self, mockEmailMultiAlternatives):
        context = {}
        template_path = "emails/closings/seller_pre_close_update_prompt.html"
        msg_plain = render_to_string(template_path, context)
        to = ['']
        cc = ['']
        send_email(template_path, {}, 'subject', "from", to, cc=cc)
        mockEmailMultiAlternatives.assert_called()

Я получаю AssertionError: Expected 'EmailMultiAlternatives' to have been called., хотя email успешно создан во время выполнения теста (проверено print(email) сразу после возвращения экземпляра <django.core.mail.message.EmailMultiAlternatives object at 0x7fbf4bb4b590>).

Что может быть причиной провала утверждения, даже если создается экземпляр EmailMultiAlternatives?

1 Ответ

1 голос
/ 09 января 2020

Из-за того, как admintools.emailer импортирует EmailMultiAlternatives, вам нужно вместо этого смоделировать admintools.email.EmailMultiAlternatives.

@patch('admintools.emailer.EmailMultiAlternatives')
def test_send_email(self, mockEmailMultiAlternatives):

send_email вызывает функцию через глобальное имя модуля, а не через django.core.mail атрибут.

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