Mik*_*keN 162 django unit-testing
我想为Django manage.py命令编写单元测试,该命令在数据库表上执行后端操作.我如何直接从代码中调用管理命令?
我不想从tests.py在操作系统的shell上执行命令,因为我无法使用manage.py test设置的测试环境(测试数据库,测试虚拟电子邮件发件箱等等)
Ale*_*lev 294
测试此类事物的最佳方法 - 从命令本身提取所需的功能到独立的功能或类.它有助于从"命令执行东西"中抽象出来并编写测试而无需额外的要求.
但是如果你由于某种原因无法解耦逻辑形式命令,你可以使用call_command方法从任何代码调用它,如下所示:
from django.core.management import call_command
call_command('my_command', 'foo', bar='baz')
Run Code Online (Sandbox Code Playgroud)
Nat*_*ate 21
而不是执行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)
Run Code Online (Sandbox Code Playgroud)
Art*_*yan 16
以下代码:
from django.core.management import call_command
call_command('collectstatic', verbosity=3, interactive=False)
call_command('migrate', 'myapp', verbosity=3, interactive=False)
Run Code Online (Sandbox Code Playgroud)
...等于终端中输入的以下命令:
$ ./manage.py collectstatic --noinput -v 3
$ ./manage.py migrate myapp --noinput -v 3
Run Code Online (Sandbox Code Playgroud)
Ala*_*ars 12
在对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())
Run Code Online (Sandbox Code Playgroud)