回答:
そのようなものをテストする最良の方法-必要な機能をコマンド自体からスタンドアロンの関数またはクラスに抽出します。「コマンド実行に関するもの」から抽象化し、追加の要件なしでテストを作成するのに役立ちます。
しかし、何らかの理由でコマンドからロジックを分離できない場合は、次のような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
おそらく、ほとんどの人が最初に試すべきことです。この回答は、Unicodeテーブル名をinspectdb
コマンドに渡す必要がある問題の回避に役立ちました。python / bashはコマンドライン引数をasciiとして解釈していましたが、それがget_table_description
djangoの呼び出しを爆破していました。
次のコード:
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())
ネイトの答えに基づいて私はこれを持っています:
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を再配線することで、この手法をさらに活用できることを確信しています-出力、終了条件などをテストしてください。