Създадох персонализирани django-admin команди
Но не знам как да го тествам в стандартни django тестове
Създадох персонализирани django-admin команди
Но не знам как да го тествам в стандартни django тестове
Ако използвате някакъв инструмент за покритие, би било добре да го извикате от кода с:
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 екземпляр
Трябва да направите вашия действителен команден скрипт възможно най-малко, така че той просто да извиква функция другаде. След това функцията може да бъде тествана чрез тестове на единици или документни тестове както обикновено.
можете да видите в 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.")
Да добавя към вече публикуваното тук. Ако вашата команда 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
Проста алтернатива на анализ на stdout е да накарате вашата команда за управление да излезе с код за грешка, ако не се изпълнява успешно, например чрез sys.exit(1).
Можете да хванете това в тест с:
with self.assertRaises(SystemExit):
call_command('mycommand')
Съгласен съм с Daniel, че действителният команден скрипт трябва да прави възможно най-малкото, но можете също да го тествате директно в Django unit test, като използвате os.popen4
.
От своя модулен тест можете да имате команда като
fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()
След това можете да анализирате съдържанието на резултата, за да проверите дали вашата Django команда е била успешна.