2009-08-17 2 views

ответ

71

Если вы используете какой-то инструмент покрытия было бы хорошо, чтобы вызвать его из кода с:

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. 
+4

Примечание: Как покрыть тестирование https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/#testing –

13

Вы должны сделать свой фактический командный сценарий минимально возможным, так что это просто вызывает функцию в другом месте. Затем эту функцию можно протестировать с помощью модульных тестов или доктрин, как обычно.

+3

Не уверен, что я согласитесь с этим. Если бы я мог это сделать, я, вероятно, не сделал бы это командой Django. Я просто запускаю его как программу python. Причина, по которой я делаю команды Django, - получить всю инфраструктуру Django. – Chuck

+0

Ну, иногда вы не можете запускать его как программу python из-за проблем с импортом. –

1

Я согласен с Даниэлем в том, что фактический командный скрипт должен делать как можно меньше, но вы также можете проверить его непосредственно в модульном тесте Django, используя os.popen4.

Изнутри вашего модульного теста вы можете иметь команду как

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

Вы можете проанализировать содержание результата, чтобы проверить, была ли ваша команда Django успешно.

+4

не используют подпроцессы для такого рода тестирования и, конечно же, не используют os.popen4, если вы действительно хотите сделать это, вы будете использовать пакет подпроцесса. –

6

вы можете увидеть в github.com пример see here

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.") 
+0

mybe вам нужно out.getvalue(). Strip() – madjardi

Смежные вопросы