[django] 테스트 드라이버에서 직접 사용자 지정 Django manage.py 명령을 호출하려면 어떻게해야합니까?

데이터베이스 테이블에서 백엔드 작업을 수행하는 Django manage.py 명령에 대한 단위 테스트를 작성하려고합니다. 코드에서 직접 관리 명령을 어떻게 호출합니까?

manage.py test (테스트 데이터베이스, 테스트 더미 이메일 발신 함 등)를 사용하여 설정된 테스트 환경을 사용할 수 없기 때문에 tests.py에서 운영 체제 쉘에서 명령을 실행하고 싶지 않습니다.



답변

이러한 것들을 테스트하는 가장 좋은 방법-필요한 기능을 명령 자체에서 독립형 함수 또는 클래스로 추출하십시오. “명령 실행 항목”에서 추상화하고 추가 요구 사항없이 테스트를 작성하는 데 도움이됩니다.

그러나 어떤 이유로 논리 양식 명령을 분리 할 수없는 경우 다음 과 같이 call_command 메소드를 사용하여 모든 코드에서 호출 할 수 있습니다 .

from django.core.management import call_command

call_command('my_command', 'foo', bar='baz')


답변

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)


답변

다음 코드 :

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_commandDjango 설명서에서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을 다시 연결하면이 기술을 좀 더 활용할 수 있음을 의미합니다. 출력, 종료 조건 등을 테스트하십시오.


답변