Apakah ada mekanisme sederhana untuk menimpa pengaturan Django untuk pengujian unit? Saya memiliki manajer di salah satu model saya yang mengembalikan sejumlah objek terbaru. Jumlah objek yang dikembalikan ditentukan oleh pengaturan NUM_LATEST.
Ini berpotensi membuat pengujian saya gagal jika seseorang mengubah pengaturan. Bagaimana saya bisa mengganti pengaturan setUp()
dan kemudian mengembalikannya tearDown()
? Jika itu tidak memungkinkan, adakah cara agar saya dapat menambal metode atau meniru pengaturannya?
EDIT: Ini kode manajer saya:
class LatestManager(models.Manager):
"""
Returns a specific number of the most recent public Articles as defined by
the NEWS_LATEST_MAX setting.
"""
def get_query_set(self):
num_latest = getattr(settings, 'NEWS_NUM_LATEST', 10)
return super(LatestManager, self).get_query_set().filter(is_public=True)[:num_latest]
Manajer menggunakan settings.NEWS_LATEST_MAX
untuk memotong queryset. Ini getattr()
hanya digunakan untuk memberikan default jika pengaturan tidak ada.
django
settings
testing
django-managers
Soviut
sumber
sumber
Jawaban:
EDIT: Jawaban ini berlaku jika Anda ingin mengubah pengaturan untuk kecil jumlah tertentu tes.
Sejak Django 1.4, terdapat cara untuk mengganti pengaturan selama pengujian: https://docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings
TestCase akan memiliki pengelola konteks self.settings, dan juga akan ada dekorator @override_settings yang dapat diterapkan ke metode pengujian atau seluruh subkelas TestCase.
Fitur-fitur ini belum ada di Django 1.3.
Jika Anda ingin mengubah pengaturan untuk semua pengujian Anda, Anda akan ingin membuat file pengaturan terpisah untuk pengujian, yang dapat memuat dan mengganti pengaturan dari file pengaturan utama Anda. Ada beberapa pendekatan bagus untuk ini di jawaban lain; Saya telah melihat variasi sukses pada kedua ini hspander dan Dmitrii ini pendekatan.
sumber
self.settings().wrapped.MEDIA_ROOT
, tapi itu sangat mengerikan.@modify_settings(MIDDLEWARE_CLASSES=...
(terima kasih atas jawaban ini)Anda dapat melakukan apa pun yang Anda suka pada
UnitTest
subkelas tersebut, termasuk menyetel dan membaca properti instance:Karena kasus pengujian django menjalankan utas tunggal, bagaimanapun, saya ingin tahu tentang apa lagi yang mungkin mengubah nilai NUM_LATEST? Jika "sesuatu yang lain" itu dipicu oleh rutinitas pengujian Anda, maka saya tidak yakin jumlah monkey patching akan menyelamatkan pengujian tanpa membatalkan kebenaran pengujian itu sendiri.
sumber
settings.TEMPLATE_LOADERS
... Jadi ini setidaknya bukan cara umum, pengaturan atau Django tidak dimuat ulang atau apapun dengan trik ini.Meskipun mengesampingkan konfigurasi pengaturan pada runtime mungkin membantu, menurut saya Anda harus membuat file terpisah untuk pengujian. Ini menghemat banyak konfigurasi untuk pengujian dan ini akan memastikan bahwa Anda tidak akan pernah melakukan sesuatu yang tidak dapat diubah (seperti membersihkan database pementasan).
Misalkan file pengujian Anda ada di 'my_project / test_settings.py', tambahkan
di manage.py Anda. Ini akan memastikan bahwa ketika Anda menjalankan
python manage.py test
Anda hanya menggunakan test_settings. Jika Anda menggunakan beberapa klien pengujian lain seperti pytest, Anda dapat dengan mudah menambahkan ini ke pytest.inisumber
Anda dapat memberikan
--settings
opsi saat menjalankan pengujiansumber
Pemutakhiran : solusi di bawah ini hanya dibutuhkan pada Django 1.3.x dan sebelumnya. Untuk> 1.4 lihat jawaban slinkp .
Jika Anda sering mengubah pengaturan dalam pengujian Anda dan menggunakan Python ≥2.5, ini juga berguna:
Kemudian Anda dapat melakukan:
sumber
yield
pernyataan, dengan bagian terakhir dari fungsi yang terdapat difinally
blok, sehingga pengaturan selalu dikembalikan.@override_settings
sangat bagus jika Anda tidak memiliki banyak perbedaan antara konfigurasi lingkungan produksi dan pengujian.Dalam kasus lain, Anda sebaiknya memiliki file pengaturan yang berbeda. Dalam hal ini proyek Anda akan terlihat seperti ini:
Jadi Anda perlu memiliki sebagian besar pengaturan Anda
base.py
dan kemudian di file lain Anda perlu mengimpor semua dari sana, dan mengganti beberapa opsi.test.py
File Anda akan terlihat seperti ini:Dan kemudian Anda perlu menentukan
--settings
opsi seperti dalam jawaban @MicroPyramid, atau menentukanDJANGO_SETTINGS_MODULE
variabel lingkungan dan kemudian Anda dapat menjalankan pengujian Anda:sumber
Menemukan ini saat mencoba memperbaiki beberapa doctests ... Untuk kelengkapan, saya ingin menyebutkan bahwa jika Anda akan mengubah pengaturan saat menggunakan doctests, Anda harus melakukannya sebelum mengimpor yang lain ...
sumber
Untuk pengguna pytest .
Masalah terbesarnya adalah:
override_settings
tidak bekerja dengan pytest.TestCase
akan membuatnya bekerja tetapi kemudian anda tidak dapat menggunakan perlengkapan pytest.Solusinya adalah dengan menggunakan
settings
perlengkapan yang didokumentasikan di sini .Contoh
Dan jika Anda perlu memperbarui beberapa bidang
sumber
Anda dapat mengganti pengaturan bahkan untuk satu fungsi pengujian.
atau Anda dapat mengganti pengaturan untuk setiap fungsi di kelas.
sumber
Saya menggunakan pytest.
Saya berhasil menyelesaikan ini dengan cara berikut:
sumber
Anda dapat mengganti pengaturan dalam pengujian dengan cara ini:
Dan jika Anda membutuhkan pengaturan yang sama di file lain, Anda dapat langsung mengimpor
test_settings
.sumber
Jika Anda memiliki beberapa file uji yang ditempatkan di subdirektori (paket python), Anda dapat mengganti pengaturan untuk semua file ini berdasarkan kondisi keberadaan string 'uji' di sys.argv
__init__.py:
Bukan pendekatan terbaik. Digunakan untuk mengubah broker Celery dari Redis ke Memory.
sumber
Saya membuat file settings_test.py baru yang akan mengimpor semuanya dari file settings.py dan memodifikasi apa pun yang berbeda untuk tujuan pengujian. Dalam kasus saya, saya ingin menggunakan bucket penyimpanan cloud yang berbeda saat menguji.
settings_test.py:
manage.py:
sumber