Pytest-django: لم يتم تعيين "mail.outbox"؟

تم إنشاؤها على ١٠ أبريل ٢٠١٨  ·  14تعليقات  ·  مصدر: pytest-dev/pytest-django

مرحبًا ، شكرًا على pytest-django! نقدر كل العمل الشاق ، استخدمه عدة مرات دون مشاكل.

نحن نواجه بعض الصعوبات حيث قمنا بترقية بعض الأشياء وفجأة لا يحتفظ mail.outbox برسائل البريد الإلكتروني أثناء الاختبارات. لقد حاولت معرفة كيفية استخدام أداة mailoutbox كما هو موثق هنا ولكني أواجه مشكلة في استخدام هذا.

في الوقت الحالي ، نختبر في فصل دراسي وقد جربت عددًا قليلاً من التكوينات لتمرير تركيبات mailoutbox . أي لقد قمت بتحديث ini:

[pytest]
usefixtures = mailoutbox

لست متأكدًا تمامًا من كيفية استخدام هذه الأداة ، فقد حاولت إضافة الوسيطة الموضعية mailoutbox إلى طرق الفصل الخاصة بي ، وما زلت غير قادر على الوصول إليها .. أنا متأكد من أنني أفتقد شيئًا بسيطًا.

سأكون ممتنًا للدفع في الاتجاه الصحيح - ومرة ​​أخرى ، شكرًا جزيلاً على هذا المشروع!

bug

التعليق الأكثر فائدة

أعتقد أنني أواجه نفس المشكلة ، لذلك قررت تجريد اختباري إلى إرسال بريد إلكتروني أساسي وتشغيله بشكل فردي:

def test_reset_password(mailoutbox, db, settings):
    text_message = render_to_string('emails/password_reset/password_reset_successful.txt',
                                    context={})
    html_message = render_to_string('emails/password_reset/password_reset_successful.html',
                                    context={})
    subject = render_to_string('emails/password_reset/password_reset_successful_subject.txt',
                               context={})

    email = EmailMultiAlternatives(
        subject=subject,
        body=text_message,
        from_email="[email protected]",
        to=['[email protected]']
    )

    if html_message:
        email.attach_alternative(html_message, "text/html")
    email.send()

    print(settings.EMAIL_BACKEND)

    assert len(mailoutbox) == 1
>       assert len(mailoutbox) == 1
E       assert 0 == 1
E        +  where 0 = len([])

accounts/tests/api/test_reset_password.py:200: AssertionError
----------------------------------------------- Captured stdout call ------------------------------------------------
django.core.mail.backends.locmem.EmailBackend
--------------------------------------------- Captured stdout teardown ----------------------------------------------

الآن الجزء الرائع هو إذا قمت بإزالة db ، فإن الاختبار يمر. لذلك حاولت حذف طريقة django_db_setup ، ولكن دون جدوى ...

أنا عالق في الوقت الحالي.

ال 14 كومينتر

راجع https://github.com/pytest-dev/pytest-django/blob/5da0935731d71aa347c57cd1753f51e3ba9f32d5/docs/helpers.rst#clearing -of-mailoutbox (7aee367).
(ليس من الواضح ما إذا كنت أفهم المشكلة بشكل صحيح)

أعتقد أنني أواجه نفس المشكلة ، لذلك قررت تجريد اختباري إلى إرسال بريد إلكتروني أساسي وتشغيله بشكل فردي:

def test_reset_password(mailoutbox, db, settings):
    text_message = render_to_string('emails/password_reset/password_reset_successful.txt',
                                    context={})
    html_message = render_to_string('emails/password_reset/password_reset_successful.html',
                                    context={})
    subject = render_to_string('emails/password_reset/password_reset_successful_subject.txt',
                               context={})

    email = EmailMultiAlternatives(
        subject=subject,
        body=text_message,
        from_email="[email protected]",
        to=['[email protected]']
    )

    if html_message:
        email.attach_alternative(html_message, "text/html")
    email.send()

    print(settings.EMAIL_BACKEND)

    assert len(mailoutbox) == 1
>       assert len(mailoutbox) == 1
E       assert 0 == 1
E        +  where 0 = len([])

accounts/tests/api/test_reset_password.py:200: AssertionError
----------------------------------------------- Captured stdout call ------------------------------------------------
django.core.mail.backends.locmem.EmailBackend
--------------------------------------------- Captured stdout teardown ----------------------------------------------

الآن الجزء الرائع هو إذا قمت بإزالة db ، فإن الاختبار يمر. لذلك حاولت حذف طريقة django_db_setup ، ولكن دون جدوى ...

أنا عالق في الوقت الحالي.

لقد نسيت أن أذكر أن هناك بعض الاختبارات ، في نفس المشروع ، حيث يبدو أن تركيبات mailoutbox تعمل ، لذا حاولت تحديد أي فرق بين تلك الاختبارات والاختبار الذي فشل.
الاختلاف الوحيد الذي وجدته هو وضع الوسيطة mailoutbox في دالة الاختبار. إذا كان قبل أي لاعبا أساسيا يعتمد على db لا يعمل ، لكنه يعمل إذا وضعته بعد ذلك ، لذلك أعتقد أنني وجدت حلاً.

يمكنني أن أؤكد أننا نشهد هذا السلوك أيضًا مع pytest-django == 3.3.3

تضمين التغريدة
شكرا للتحقيق / التحديث.
سيكون مفيدًا لشخص ما في تصحيح / إصلاح هذا.

لست متأكدًا مما إذا كان مرتبطًا حقًا ، لكنني وجدت أنه قد يكون هناك خطأ في سمة بسبب عدم تعيين mail.outbox في المقام الأول - ولكن هذا مرتبط بتغيير البيئة أثناء دوران pytest-django.
المرجع: https://github.com/pytest-dev/pytest-django/pull/708

لدي مشكلة حاليًا ، صندوق البريد الإلكتروني هذا ليس فارغًا :(
إنها أحدث حجة دالة اختبار.

تحرير: اتصل بـ mailoutbox.clear() قبل رمز الاختبار الحقيقي كـ work-a-round.

تضمين التغريدة
هل يمكنك تقديم حالة اختبار قابلة للتكرار؟ سيكون الاختبار الفاشل لـ pytest-django هو الأفضل بالطبع.

ذات صلة بـ # 708؟ (على سبيل المثال ، كزة حول الشفرة التي تلامسها هناك)

لقد أنشأت حالة اختبار تافهة تعيد إظهار المشكلة (على الأقل بالطريقة التي أواجهها بها): https://github.com/pytest-dev/pytest-django/compare/master...koniiiik : 589- mailoutbox-is-not-django-core-mail-outbox؟ توسيع = 1

من الطريقة التي استخدمت بها mailoutbox ، سيكون من المفيد أيضًا أن تكون قادرًا على مسح mailoutbox.clear() كلاً من mailoutbox و mail.outbox . إذا كان mailoutbox is mail.outbox ، فيمكن لشخص ما أن يمسح صندوق الصادر قبل تشغيل الكود الذي من المفترض أن يُنشئ عددًا محددًا من رسائل البريد الإلكتروني (IE مثل 1 email).

لست متأكدًا مما إذا كان هذا مرتبطًا بهذه المشكلة ، ولكن لا تتطابق تركيبات mailoutbox مع سلوك mail.outbox في اختباري. إنه لا يجمع رسائل البريد الإلكتروني المرسلة:

(Pdb) mail.outbox
[<django.core.mail.message.EmailMultiAlternatives object at 0x7f6d864cb198>]
(Pdb) mailoutbox
[]
(Pdb)

لست متأكدًا مما إذا كان هذا مرتبطًا بهذه المشكلة ، ولكن لا تتطابق تركيبات mailoutbox مع سلوك mail.outbox في اختباري. إنه لا يجمع رسائل البريد الإلكتروني المرسلة:

(Pdb) mail.outbox
[<django.core.mail.message.EmailMultiAlternatives object at 0x7f6d864cb198>]
(Pdb) mailoutbox
[]
(Pdb)

نفس.
mail.outbox على رسالة بينما mailoutbox فارغ.
إصدار pytest-django هو 3.9.0.

لدي نفس المشكلة.

إذا كنت أستخدم التثبيت مثل هذا فاشل:

def test_send_foo_mail(mailoutbox, user_client, foo):

مثل هذا يعمل:

def test_send_foo_mail(user_client, foo, mailoutbox):

استغرق الأمر مني الكثير من الوقت لاكتشافه. أود المساعدة في تصحيح هذا. نظرت إلى التطبيق ، لكن ليس لدي أدنى فكرة عن كيفية تصحيح هذا.

ذات صلة: https://stackoverflow.com/questions/66846621/mailoutbox-works-only-if-last-fixture

تعاني من نفس سلوك المعلق السابق. استخدامه بهذه الطريقة لا يعمل:

def test_command_and_email(
    mailoutbox, argument, time_machine, mocker 
):

لكن كل شيء يعمل كما هو متوقع إذا وضعته في آخر مكان.

def test_command_and_email(
    argument, time_machine, mocker, mailoutbox
):

الحجة argument هي أيضًا أداة ثابتة تستخدم db ، لذلك أعتقد أن هذا هو السبب الرئيسي لهذا السلوك.
أنا أستخدم pytets-django 4.3.0

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات