tutorial queryset proyecto estructura cual consultas avanzadas django unit-testing

proyecto - queryset en django



¿Cómo puedo llamar un comando Django manage.py personalizado directamente desde un controlador de prueba? (5)

Basándome en la respuesta de Nate, tengo esto:

def make_test_wrapper_for(command_module): def _run_cmd_with(*args): """Run the possibly_add_alert command with the supplied arguments""" cmd = command_module.Command() (opts, args) = OptionParser(option_list=cmd.option_list).parse_args(list(args)) cmd.handle(*args, **vars(opts)) return _run_cmd_with

Uso:

from myapp.management import mycommand cmd_runner = make_test_wrapper_for(mycommand) cmd_runner("foo", "bar")

La ventaja aquí es que si ha utilizado opciones adicionales y OptParse, esto lo resolverá por usted. No es del todo perfecto, y aún no canaliza las salidas, pero usará la base de datos de prueba. A continuación, puede probar los efectos de la base de datos.

Estoy seguro de que el uso del módulo simulado de Micheal Foords y también el cableado de reconexión para la duración de una prueba significa que también podría obtener más de esta técnica: pruebe la salida, las condiciones de salida, etc.

Quiero escribir una prueba unitaria para un comando Django manage.py que realice una operación back-end en una tabla de base de datos. ¿Cómo invocaría el comando de administración directamente desde el código?

No deseo ejecutar el comando en el shell del sistema operativo de tests.py porque no puedo usar el entorno de prueba configurado mediante la prueba manage.py (base de datos de prueba, bandeja de entrada de correo electrónico de prueba, etc.)


En lugar de hacer el truco call_command, puede ejecutar su tarea haciendo:

from myapp.management.commands import my_management_task cmd = my_management_task.Command() opts = {} # kwargs for your command -- lets you override stuff for testing... cmd.handle_noargs(**opts)


La documentación de Django en el call_command no menciona que debe ser redirigido a sys.stdout . El código de ejemplo debería decir:

from django.core.management import call_command from django.test import TestCase from django.utils.six import StringIO import sys class ClosepollTest(TestCase): def test_command_output(self): out = StringIO() sys.stdout = out call_command(''closepoll'', stdout=out) self.assertIn(''Expected output'', out.getvalue())


La mejor manera de probar tales cosas: extraiga la funcionalidad necesaria del comando mismo para funcionar o clase independiente. Ayuda a abstraer de "cosas de ejecución de comandos" y escribir pruebas sin requisitos adicionales.

Pero si por alguna razón no puede desacoplar el comando de lógica de formulario, puede llamarlo desde cualquier código usando el método call_command como este:

from django.core.management import call_command call_command(''my_command'', ''foo'', bar=''baz'')


el siguiente código:

from django.core.management import call_command call_command(''collectstatic'', verbosity=3, interactive=False) call_command(''migrate'', ''myapp'', verbosity=3, interactive=False)

... es igual a los siguientes comandos escritos en terminal:

$ ./manage.py collectstatic --noinput -v 3 $ ./manage.py migrate myapp --noinput -v 3

Consulte la ejecución de comandos de administración desde django docs .