Pytest-django: `mail.outbox` tidak disetel?

Dibuat pada 10 Apr 2018  ·  14Komentar  ·  Sumber: pytest-dev/pytest-django

Hai, terima kasih untuk pytest-Django! Hargai semua kerja keras, telah menggunakannya beberapa kali tanpa masalah.

Kami mengalami sedikit masalah saat kami meningkatkan beberapa hal dan tiba-tiba mail.outbox tidak menyimpan email selama pengujian. Saya telah mencoba mencari tahu bagaimana tepatnya menggunakan perlengkapan mailoutbox seperti yang didokumentasikan di sini, tetapi saya mengalami masalah dalam menggunakan ini.

Saat ini kami sedang menguji di kelas dan saya telah mencoba beberapa konfigurasi untuk melewati perlengkapan mailoutbox . Yaitu saya memperbarui ini:

[pytest]
usefixtures = mailoutbox

Tidak begitu yakin bagaimana menggunakan perlengkapan itu, saya mencoba menambahkan argumen posisi mailoutbox ke metode kelas saya, masih tidak dapat mengaksesnya.. Saya yakin saya melewatkan sesuatu yang sederhana.

Akan sangat menghargai dorongan ke arah yang benar -- dan sekali lagi, terima kasih banyak untuk proyek ini!

bug

Komentar yang paling membantu

Saya pikir saya mengalami masalah yang sama, jadi saya memutuskan untuk menghapus pengujian saya ke pengiriman email dasar dan menjalankannya satu per satu:

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 ----------------------------------------------

Sekarang bagian yang keren adalah jika saya menghapus perlengkapan db , tes lulus. Jadi saya mencoba menghapus metode django_db_setup , tetapi tidak berhasil ...

Aku terjebak saat ini.

Semua 14 komentar

Lihat https://github.com/pytest-dev/pytest-django/blob/5da0935731d71aa347c57cd1753f51e3ba9f32d5/docs/helpers.rst#clearing -of-mailoutbox (7aee367).
(Tidak jelas apakah saya memahami masalah ini dengan benar)

Saya pikir saya mengalami masalah yang sama, jadi saya memutuskan untuk menghapus pengujian saya ke pengiriman email dasar dan menjalankannya satu per satu:

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 ----------------------------------------------

Sekarang bagian yang keren adalah jika saya menghapus perlengkapan db , tes lulus. Jadi saya mencoba menghapus metode django_db_setup , tetapi tidak berhasil ...

Aku terjebak saat ini.

Saya lupa menyebutkan ada beberapa tes, dalam proyek yang sama, di mana perlengkapan mailoutbox tampaknya berfungsi, jadi saya mencoba menemukan perbedaan antara tes tersebut dan yang gagal.
Satu-satunya perbedaan yang saya temukan adalah posisi argumen mailoutbox dalam fungsi pengujian. Jika sebelum perlengkapan apa pun yang bergantung pada perlengkapan db itu tidak berfungsi, tetapi berfungsi jika saya meletakkannya setelahnya, jadi saya kira saya menemukan solusi.

Saya dapat mengonfirmasi bahwa kami juga melihat perilaku ini dengan pytest-Django==3.3.3

@bogdanpetrea
Terima kasih atas penyelidikan/pembaruan.
Akan sangat membantu bagi seseorang yang men-debug/memperbaiki ini.

Tidak yakin apakah itu benar-benar terkait, tetapi saya telah menemukan bahwa mungkin ada AttributeError karena mail.outbox tidak disetel sejak awal - tetapi ini terkait dengan mengubah lingkungan saat pytest-Django berputar.
Ref: https://github.com/pytest-dev/pytest-Django/pull/708

Saat ini saya memiliki masalah, kotak surat itu tidak kosong :(
Ini adalah argumen fungsi pengujian terbaru.

EDIT: Saya memanggil mailoutbox.clear() sebelum kode tes nyata sebagai pekerjaan-a-round.

@jedie
Bisakah Anda memberikan kasus uji yang dapat direproduksi? Tes yang gagal untuk pytest-Django akan menjadi yang terbaik, tentu saja.

Terkait dengan #708? (yaitu melihat-lihat kode yang disentuhnya di sana)

Saya telah membuat kasus uji sepele yang mereproduksi masalah (setidaknya seperti yang saya alami): https://github.com/pytest-dev/pytest-Django/compare/master...koniiiik :589- kotak surat-bukan-Django-core-mail-kotak keluar?expand=1

Dari cara saya menggunakan mailoutbox , akan sangat membantu jika mailoutbox.clear() benar-benar menghapus mailoutbox dan mail.outbox . Jika mailoutbox is mail.outbox , maka seseorang dapat mengosongkan kotak keluar sebelum menjalankan kode yang seharusnya menghasilkan sejumlah email tertentu (yaitu email 1 ).

Tidak yakin apakah ini terkait dengan masalah ini, tetapi perlengkapan mailoutbox tidak cocok dengan perilaku mail.outbox dalam pengujian saya. Itu tidak mengumpulkan email yang dikirim:

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

Tidak yakin apakah ini terkait dengan masalah ini, tetapi perlengkapan mailoutbox tidak cocok dengan perilaku mail.outbox dalam pengujian saya. Itu tidak mengumpulkan email yang dikirim:

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

Sama.
mail.outbox berisi pesan saat mailoutbox kosong.
versi pytest-Django adalah 3.9.0.

Saya memiliki masalah yang sama.

Jika saya menggunakan perlengkapan seperti ini gagal:

def test_send_foo_mail(mailoutbox, user_client, foo):

Seperti ini ia bekerja:

def test_send_foo_mail(user_client, foo, mailoutbox):

Butuh banyak waktu bagi saya untuk menemukannya. Saya ingin membantu men-debug ini. Saya melihat implementasinya, tetapi saya tidak tahu cara men-debug ini.

Terkait: https://stackoverflow.com/questions/66846621/mailoutbox-works-only-if-last-fixture

Mengalami perilaku yang sama seperti komentator sebelumnya. Menggunakannya seperti ini tidak berfungsi:

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

Tetapi semuanya berfungsi seperti yang diharapkan jika saya meletakkannya di tempat terakhir.

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

Argumen argument juga merupakan perlengkapan yang menggunakan perlengkapan db , jadi saya rasa itulah alasan utama dari perilaku ini.
Saya menggunakan pytets-django 4.3.0

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

aljosa picture aljosa  ·  8Komentar

blueyed picture blueyed  ·  7Komentar

AndreaCrotti picture AndreaCrotti  ·  5Komentar

ojake picture ojake  ·  6Komentar

tolomea picture tolomea  ·  6Komentar