Интеграционный тест Celery Pytest не работает должным образом с электронными письмами django
Я создал задание для celery и протестировал его как единое целое с помощью этого теста:
@pytest.mark.django_db
def test_document_expiry_alert_unit(settings):
settings.CELERY_TASK_ALWAYS_EAGER = True
manager = UserFactory(
email="manager@mail.com", role=Role.MANAGER, organization__check_docs=True
)
doc = EmployeeDocumentFactory(user__organization=manager.organization)
mail.outbox = []
document_expiry_alert.delay()
assert len(mail.outbox) == 1
sent = mail.outbox[0]
html_content = sent.alternatives[0][0]
assert manager.email in sent.to
assert doc.get_type_display() in html_content
assert doc.user.get_full_name() in html_content
assert "documents are expiring tomorrow" in sent.body
Это сработало, и тест прошел успешно, затем я попытался провести интеграционный тест, поэтому я установил celery[pytest] и добавил конфигурацию в pytest вместе с плагином в conftest.py, celery.contrib.pytest
Теперь я попробовал запустить этот тест:
@pytest.mark.django_db(transaction=True)
def test_document_expiry_alert_intergration(celery_app, celery_worker):
manager = UserFactory(
email="manager@mail.com", role=Role.MANAGER, organization__check_docs=True
)
EmployeeDocumentFactory(user__organization=manager.organization)
mail.outbox = []
celery_app.send_task("organizations.tasks.document_expiry_alert")
celery_worker.reload()
assert len(mail.outbox) == 1
assert manager.email in mail.outbox[0].to
Но я получаю эту ошибку FAILED tests/organizations/task_tests.py::test_document_expiry_alert_intergration - assert 0 == 1
что означает, что в почтовый ящик не отправлено письмо, я попытался использовать @patch, чтобы имитировать отправку, но также получил нулевое количество вызовов. При запуске теста в моем терминале отображаются логи и инструкции для печати, так что все, что было до отправки электронного письма, все работает.
Я использую django.core.mail.EmailMultiAlternatives для отправки электронного письма.