Как да тествате персонализирани django-admin команди

Създадох персонализирани django-admin команди

Но не знам как да го тествам в стандартни django тестове


person dixon    schedule 17.08.2009    source източник


Отговори (6)


Ако използвате някакъв инструмент за покритие, би било добре да го извикате от кода с:

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.

От официалната документация

Командите за управление могат да бъдат тествани с функцията call_command(). Изходът може да бъде пренасочен към StringIO екземпляр

person Jorge E. Cardona    schedule 28.06.2011
comment
Обърнете внимание на Как да обхваща тестване docs.djangoproject.com/en /1.9/howto/custom-management-commands/ - person Harry Moreno; 01.07.2016

Трябва да направите вашия действителен команден скрипт възможно най-малко, така че той просто да извиква функция другаде. След това функцията може да бъде тествана чрез тестове на единици или документни тестове както обикновено.

person Daniel Roseman    schedule 17.08.2009
comment
Не съм сигурен, че съм съгласен с това. Ако можех да направя това, вероятно нямаше да го направя Django команда. Просто бих го стартирал като програма на Python. Причината, поради която правя Django команди, е да получа цялата инфраструктура на Django. - person Chuck; 20.02.2014
comment
Е, понякога не можете просто да го стартирате като програма на Python поради проблеми с импортирането. - person Pavel Vergeev; 23.01.2018

можете да видите в github.com пример вижте тук

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.")
person madjardi    schedule 22.01.2015
comment
може би имате нужда от out.getvalue().strip() - person madjardi; 22.01.2015

Да добавя към вече публикуваното тук. Ако вашата команда django-admin предава файл като параметър, можете да направите нещо подобно:

from django.test import TestCase
from django.core.management import call_command
from io import StringIO
import os


class CommandTestCase(TestCase):
    def test_command_import(self):
        out = StringIO()
        call_command(
            'my_command', os.path.join('path/to/file', 'my_file.txt'),
            stdout=out
        )
        self.assertIn(
        'Expected Value',
            out.getvalue()
        )

Това работи, когато вашата django-команда се използва по начин като този:

$ python manage.py my_command my_file.txt
person asfor    schedule 21.02.2020

Проста алтернатива на анализ на stdout е да накарате вашата команда за управление да излезе с код за грешка, ако не се изпълнява успешно, например чрез sys.exit(1).

Можете да хванете това в тест с:

    with self.assertRaises(SystemExit):
        call_command('mycommand')
person Bosco    schedule 04.08.2018

Съгласен съм с Daniel, че действителният команден скрипт трябва да прави възможно най-малкото, но можете също да го тествате директно в Django unit test, като използвате os.popen4.

От своя модулен тест можете да имате команда като

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

След това можете да анализирате съдържанието на резултата, за да проверите дали вашата Django команда е била успешна.

person Aaron Vernon    schedule 09.01.2010
comment
не използвайте подпроцеси за този вид тестване и със сигурност не използвайте os.popen4, ако наистина искате да направите това, бихте използвали пакета подпроцеси. - person Chris Withers; 07.01.2015