답변:
이러한 것들을 테스트하는 가장 좋은 방법-필요한 기능을 명령 자체에서 독립형 함수 또는 클래스로 추출하십시오. "명령 실행 항목"에서 추상화하고 추가 요구 사항없이 테스트를 작성하는 데 도움이됩니다.
그러나 어떤 이유로 논리 양식 명령을 분리 할 수없는 경우 다음 과 같이 call_command 메소드를 사용하여 모든 코드에서 호출 할 수 있습니다 .
from django.core.management import call_command
call_command('my_command', 'foo', bar='baz')
call_command('check')
테스트에서 시스템 검사가 통과되도록하는 데 여전히 유용하다고 생각합니다 .
call_command 트릭을 수행하는 대신 다음을 수행하여 작업을 실행할 수 있습니다.
from myapp.management.commands import my_management_task
cmd = my_management_task.Command()
opts = {} # kwargs for your command -- lets you override stuff for testing...
cmd.handle_noargs(**opts)
call_command
테스트 된 응용 프로그램을에로드해야합니다 INSTALLED_APPS
. 테스트 목적으로 앱을로드하고이를 사용하는 사이에서 이것을 선택했습니다.
call_command
아마도 대부분의 사람들이 먼저 시도해야 할 것입니다. 이 답변은 유니 코드 테이블 이름을 inspectdb
명령 에 전달 해야하는 문제를 해결하는 데 도움이되었습니다 . python / bash는 커맨드 라인 인수를 ASCII로 해석하고 있었고 get_table_description
장고 에서 전화를 폭파했습니다 .
다음 코드 :
from django.core.management import call_command
call_command('collectstatic', verbosity=3, interactive=False)
call_command('migrate', 'myapp', verbosity=3, interactive=False)
... 터미널에 입력 된 다음 명령과 같습니다.
$ ./manage.py collectstatic --noinput -v 3
$ ./manage.py migrate myapp --noinput -v 3
django docs에서 관리 명령 실행을 참조하십시오 .
call_command 의 Django 설명서에서out
리디렉션되어야한다는 언급이 없습니다 sys.stdout
. 예제 코드는 다음과 같아야합니다.
from django.core.management import call_command
from django.test import TestCase
from django.utils.six import StringIO
import sys
class ClosepollTest(TestCase):
def test_command_output(self):
out = StringIO()
sys.stdout = out
call_command('closepoll', stdout=out)
self.assertIn('Expected output', out.getvalue())
Nate의 답변을 바탕으로 나는 이것을 가지고있다 :
def make_test_wrapper_for(command_module):
def _run_cmd_with(*args):
"""Run the possibly_add_alert command with the supplied arguments"""
cmd = command_module.Command()
(opts, args) = OptionParser(option_list=cmd.option_list).parse_args(list(args))
cmd.handle(*args, **vars(opts))
return _run_cmd_with
용법:
from myapp.management import mycommand
cmd_runner = make_test_wrapper_for(mycommand)
cmd_runner("foo", "bar")
여기서 추가 옵션과 OptParse를 사용했다면 이점이 있습니다. 완벽하지는 않지만 아직 파이프 출력을하지는 않지만 테스트 데이터베이스를 사용합니다. 그런 다음 데이터베이스 효과를 테스트 할 수 있습니다.
필자는 Micheal Foords 모의 모듈을 사용하고 테스트 기간 동안 stdout을 다시 연결하면이 기술을 좀 더 활용할 수 있음을 의미합니다. 출력, 종료 조건 등을 테스트하십시오.