但是,我不知道如何在标准 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 示例中看到 看这里
from StringIO import StringIO
from django.test import TestCase
from django.core import management
class CommandTests(TestCase):
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 的观点,即实际的命令脚本应该尽可能少地执行,但您也可以使用
os.popen4
在 Django 单元测试中直接测试它。
在单元测试中,您可以使用类似的命令
fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()
然后你可以分析结果的内容来测试你的Django命令是否成功。