Je souhaite écrire un test unitaire pour une commande Django manage.py qui effectue une opération de backend sur une table de base de données. Comment appeler la commande de gestion directement à partir du code?
Je ne veux pas exécuter la commande sur le shell du système d'exploitation à partir de tests.py car je ne peux pas utiliser l'environnement de test configuré à l'aide de manage.py test (base de données de test, boîte d'envoi d'e-mail factice de test, etc.)
la source
call_command('check')
, pour s'assurer que les vérifications du système sont réussies, dans un test.Plutôt que de faire l'astuce call_command, vous pouvez exécuter votre tâche en faisant:
la source
call_command
besoin de l'application testée pour être chargéeINSTALLED_APPS
. Entre devoir charger l'application uniquement à des fins de test et l'utiliser, j'ai choisi ceci.call_command
est probablement ce que la plupart des gens devraient essayer en premier. Cette réponse m'a aidé à contourner un problème où je devais passer des noms de table Unicode à lainspectdb
commande. python / bash interprétaient les arguments de ligne de commande comme ascii, et cela bombardait l'get_table_description
appel profondément dans django.le code suivant:
... est égal aux commandes suivantes tapées dans le terminal:
Voir l' exécution des commandes de gestion à partir de la documentation django .
la source
La documentation Django sur la commande call_command ne mentionne pas qui
out
doit être redirigé verssys.stdout
. L'exemple de code doit lire:la source
En m'appuyant sur la réponse de Nate, j'ai ceci:
Usage:
L'avantage ici est que si vous avez utilisé des options supplémentaires et OptParse, cela réglera le problème pour vous. Ce n'est pas tout à fait parfait - et il ne dirige pas encore les sorties - mais il utilisera la base de données de test. Vous pouvez ensuite tester les effets de la base de données.
Je suis sûr que l'utilisation du module simulé Micheal Foords et le recâblage de stdout pendant la durée d'un test signifieraient que vous pourriez aussi tirer un peu plus de cette technique - tester la sortie, les conditions de sortie, etc.
la source