Comment tester les commandes django-admin personnalisées

J'ai créé Commandes django-admin personnalisées

Mais, je ne sais pas comment le tester dans tests django standard

45
demandé sur dixon 2009-08-17 12:04:48

5 réponses

Si vous utilisez un outil de couverture, il serait bon de l'appeler à partir du code avec:

from django.core.management import call_command
from django.test import TestCase

class CommandsTestCase(TestCase):
    def test_mycommand(self):
        " Test my custom command."

        args = []
        opts = {}
        call_command('mycommand', *args, **opts)

        # Some Asserts.
79
répondu Jorge E. Cardona 2013-05-21 22:23:04

Vous devriez rendre votre script de commande réel le minimum possible, de sorte qu'il appelle simplement une fonction ailleurs. La fonction peut ensuite être testée via des tests unitaires ou des doctests comme d'habitude.

16
répondu Daniel Roseman 2009-08-17 14:37:52

Vous pouvez voir dans github.com exemple voir ici

def test_command_style(self):
    out = StringIO()
    management.call_command('dance', style='Jive', stdout=out)
    self.assertEquals(out.getvalue(),
        "I don't feel like dancing Jive.")
8
répondu madjardi 2015-01-22 06:48:04

Je suis d'accord avec Daniel que le script de commande réel devrait faire le minimum possible mais vous pouvez également le tester directement dans un test unitaire Django en utilisant os.popen4.

À partir de votre test unitaire, vous pouvez avoir une commande comme

fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()

Vous pouvez ensuite analyser le contenu de result pour tester si votre commande Django a réussi.

0
répondu Aaron Vernon 2010-01-09 00:49:16

Une alternative simple à parsing stdout consiste à faire quitter votre commande de gestion avec un code d'erreur si elle ne fonctionne pas correctement, par exemple en utilisant sys.la sortie(1).

Vous pouvez l'attraper dans un test avec:

    with self.assertRaises(SystemExit):
        call_command('mycommand')
0
répondu Bosco 2018-08-04 11:39:01