مرحبًا ، شكرًا على pytest-django! نقدر كل العمل الشاق ، استخدمه عدة مرات دون مشاكل.
نحن نواجه بعض الصعوبات حيث قمنا بترقية بعض الأشياء وفجأة لا يحتفظ mail.outbox
برسائل البريد الإلكتروني أثناء الاختبارات. لقد حاولت معرفة كيفية استخدام أداة mailoutbox
كما هو موثق هنا ولكني أواجه مشكلة في استخدام هذا.
في الوقت الحالي ، نختبر في فصل دراسي وقد جربت عددًا قليلاً من التكوينات لتمرير تركيبات mailoutbox
. أي لقد قمت بتحديث ini:
[pytest]
usefixtures = mailoutbox
لست متأكدًا تمامًا من كيفية استخدام هذه الأداة ، فقد حاولت إضافة الوسيطة الموضعية mailoutbox
إلى طرق الفصل الخاصة بي ، وما زلت غير قادر على الوصول إليها .. أنا متأكد من أنني أفتقد شيئًا بسيطًا.
سأكون ممتنًا للدفع في الاتجاه الصحيح - ومرة أخرى ، شكرًا جزيلاً على هذا المشروع!
راجع 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
التعليق الأكثر فائدة
أعتقد أنني أواجه نفس المشكلة ، لذلك قررت تجريد اختباري إلى إرسال بريد إلكتروني أساسي وتشغيله بشكل فردي:
الآن الجزء الرائع هو إذا قمت بإزالة
db
، فإن الاختبار يمر. لذلك حاولت حذف طريقةdjango_db_setup
، ولكن دون جدوى ...أنا عالق في الوقت الحالي.