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!
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 perilakumail.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
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:
Sekarang bagian yang keren adalah jika saya menghapus perlengkapan
db
, tes lulus. Jadi saya mencoba menghapus metodedjango_db_setup
, tetapi tidak berhasil ...Aku terjebak saat ini.