¿Existe algún mecanismo simple para anular la configuración de Django para una prueba unitaria? Tengo un administrador en uno de mis modelos que devuelve un número específico de los últimos objetos. El número de objetos que devuelve se define mediante una configuración NUM_LATEST.
Esto tiene el potencial de hacer que mis pruebas fallen si alguien cambia la configuración. ¿Cómo puedo anular la configuración setUp()
y luego restaurarla tearDown()
? Si eso no es posible, ¿hay alguna forma de que pueda modificar el método o simular la configuración?
EDITAR: Aquí está mi código de administrador:
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]
El administrador utiliza settings.NEWS_LATEST_MAX
para dividir el conjunto de consultas. Se getattr()
utiliza simplemente para proporcionar un valor predeterminado en caso de que la configuración no exista.
fuente
Respuestas:
EDITAR: esta respuesta se aplica si desea cambiar la configuración de una pequeña cantidad de pruebas específicas .
Desde Django 1.4, hay formas de anular la configuración durante las pruebas: https://docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings
TestCase tendrá un administrador de contexto self.settings, y también habrá un decorador @override_settings que se puede aplicar a un método de prueba o una subclase completa de TestCase.
Estas características aún no existían en Django 1.3.
Si desea cambiar la configuración de todas sus pruebas, querrá crear un archivo de configuración separado para la prueba, que puede cargar y anular la configuración de su archivo de configuración principal. Hay varios buenos enfoques para esto en las otras respuestas; He visto variaciones exitosas en los enfoques de hspander y dmitrii .
fuente
self.settings().wrapped.MEDIA_ROOT
, pero eso es bastante terrible.@modify_settings(MIDDLEWARE_CLASSES=...
(gracias por esta respuesta)Puede hacer lo que quiera con la
UnitTest
subclase, incluida la configuración y lectura de las propiedades de la instancia:Sin embargo, dado que los casos de prueba de django se ejecutan en un solo subproceso, tengo curiosidad por saber qué más puede estar modificando el valor NUM_LATEST. Si esa "otra cosa" es activada por su rutina de prueba, entonces no estoy seguro de que cualquier cantidad de parches de mono salvará la prueba sin invalidar la veracidad de las pruebas en sí.
fuente
settings.TEMPLATE_LOADERS
... Entonces esta no es una forma general al menos, la configuración o Django no se recarga ni nada con este truco.Aunque anular la configuración de la configuración en tiempo de ejecución puede ayudar, en mi opinión, debería crear un archivo separado para probar. Esto ahorra mucha configuración para las pruebas y esto aseguraría que nunca termine haciendo algo irreversible (como limpiar la base de datos provisional).
Digamos que su archivo de prueba existe en 'my_project / test_settings.py', agregue
en su manage.py. Esto asegurará que cuando ejecute
python manage.py test
use test_settings solamente. Si está utilizando algún otro cliente de prueba como pytest, podría agregarlo fácilmente a pytest.inifuente
Puede pasar la
--settings
opción al realizar pruebasfuente
Actualización : la siguiente solución solo es necesaria en Django 1.3.xy versiones anteriores. Para> 1.4, vea la respuesta de slinkp .
Si cambia la configuración con frecuencia en sus pruebas y usa Python ≥2.5, esto también es útil:
Entonces puedes hacer:
fuente
yield
declaración, con la parte final de la función contenida en elfinally
bloque, para que la configuración siempre se revierte.@override_settings
es excelente si no tiene muchas diferencias entre las configuraciones de su entorno de producción y de prueba.En otro caso, será mejor que tenga diferentes archivos de configuración. En este caso, su proyecto se verá así:
Por lo tanto, debe tener la mayor parte de su configuración
base.py
y luego en otros archivos, debe importar todo desde allí y anular algunas opciones. Así es comotest.py
se verá su archivo:Y luego debe especificar la
--settings
opción como en la respuesta de @MicroPyramid, o especificarDJANGO_SETTINGS_MODULE
la variable de entorno y luego puede ejecutar sus pruebas:fuente
Encontré esto mientras intentaba arreglar algunas pruebas de documentación ... Para completar, quiero mencionar que si va a modificar la configuración al usar pruebas de documentación, debe hacerlo antes de importar cualquier otra cosa ...
fuente
Para usuarios de Pytest .
El mayor problema es:
override_settings
no funciona con pytest.TestCase
lo hará funcionar, pero luego no puede usar los accesorios de pytest.La solución es utilizar el
settings
accesorio documentado aquí .Ejemplo
Y en caso de que necesite actualizar varios campos
fuente
Puede anular la configuración incluso para una única función de prueba.
o puede anular la configuración de cada función en la clase.
fuente
Estoy usando pytest.
Logré resolver esto de la siguiente manera:
fuente
Puede anular la configuración en la prueba de esta manera:
Y si necesita estas mismas configuraciones en otro archivo, puede importarlas directamente
test_settings
.fuente
Si tiene varios archivos de prueba colocados en un subdirectorio (paquete de Python), puede anular la configuración de todos estos archivos en función de la condición de presencia de la cadena de 'prueba' en sys.argv
__init__.py:
No es el mejor enfoque. Lo usé para cambiar el corredor de apio de Redis a Memory.
fuente
Creé un nuevo archivo settings_test.py que importaría todo del archivo settings.py y modificaría lo que sea diferente para fines de prueba. En mi caso, quería usar un depósito de almacenamiento en la nube diferente al realizar la prueba.
settings_test.py:
manage.py:
fuente