data - test form django
Detectar el modo de prueba django (4)
No estoy seguro de su caso de uso, pero una de las formas que he visto para detectar cuándo se está ejecutando el conjunto de pruebas es comprobar si django.core.mail
tiene un atributo de la outbox
como:
from django.core import mail
if hasattr(mail, ''outbox''):
# We are in test mode!
pass
else:
# Not in test mode...
pass
Este atributo es agregado por el corredor de prueba de Django en setup_test_environment
y eliminado en teardown_test_environment
. Puede consultar la fuente aquí: https://code.djangoproject.com/browser/django/trunk/django/test/utils.py
Editar: si solo quieres modelos definidos para la prueba, deberías echarle un vistazo al ticket # 7835 de Django, en particular, el comentario # 24, parte del cual se detalla a continuación:
Aparentemente, simplemente puede definir modelos directamente en su tests.py. Syncdb nunca importa tests.py, por lo que esos modelos no se sincronizarán con la base de datos normal, pero se sincronizarán con la base de datos de prueba y se podrán usar en las pruebas.
Estoy escribiendo una aplicación django reutilizable y necesito asegurarme de que sus modelos solo se sincronicen cuando la aplicación está en modo de prueba. Intenté usar un DjangoTestRunner personalizado, pero no encontré ejemplos de cómo hacerlo (la documentación solo muestra cómo definir un corredor de prueba personalizado).
Entonces, ¿alguien tiene una idea de cómo hacerlo?
EDITAR
Así es como lo estoy haciendo:
#in settings.py
import sys
TEST = ''test'' in sys.argv
Espero eso ayude.
La respuesta seleccionada es un hack masivo. :)
Un truco menos masivo sería crear su propia subclase TestSuiteRunner y cambiar una configuración o hacer cualquier otra cosa que necesite para el resto de su aplicación. Usted especifica el corredor de prueba en su configuración:
TEST_RUNNER = ''your.project.MyTestSuiteRunner''
En general, no desea hacer esto, pero funciona si realmente lo necesita.
from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner
class MyTestSuiteRunner(DjangoTestSuiteRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
NOTA: A partir de Django 1.8, DjangoTestSuiteRunner
ha quedado obsoleto. Deberías usar DiscoverRunner
lugar:
from django.conf import settings
from django.test.runner import DiscoverRunner
class MyTestSuiteRunner(DiscoverRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
Creo que la respuesta proporcionada aquí https://.com/a/7651002/465673 es una forma mucho más clara de hacerlo:
Pon esto en tu settings.py:
import sys
TESTING = sys.argv[1:2] == [''test'']
Estoy usando las anulaciones de settings.py. Tengo un settings.py global, que contiene la mayoría de las cosas, y luego tengo anulaciones para él. Cada archivo de configuración comienza con:
from myproject.settings import settings
y luego pasa a anular algunas de las configuraciones.
- prod_settings.py - Configuración de producción (por ejemplo, reemplaza DEBUG = False)
- dev_settings.py - Configuración de desarrollo (por ejemplo, más registro)
- test_settings.py
Y luego puedo definir UNIT_TESTS = False en la base settings.py, y anularlo a UNIT_TESTS = True en test_settings.py.
Luego, cada vez que ejecuto un comando, debo decidir con qué configuración ejecutarme (por ejemplo, DJANGO_SETTINGS_MODULE=myproject.test_settings ./manage.py test
). Me gusta esa claridad.