test form data django unit-testing django-testing

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.