如何测试自定义 django-admin 命令

问题描述 投票:0回答:6

我创建了自定义 django-admin 命令

但是,我不知道如何在标准 django 测试中测试它

django testing django-admin custom-action
6个回答
128
投票

如果您正在使用某种覆盖工具,最好从代码中调用它:

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 实例


23
投票

您应该使实际的命令脚本尽可能最小,以便它只调用其他地方的函数。然后可以像平常一样通过单元测试或文档测试来测试该功能。


20
投票

你可以在 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.")

7
投票

添加到此处已发布的内容。如果你的 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

-1
投票

解析 stdout 的一个简单替代方法是,如果管理命令未成功运行,则退出并显示错误代码,例如使用 sys.exit(1)。

您可以通过以下方式在测试中发现这一点:

    with self.assertRaises(SystemExit):
        call_command('mycommand')

-3
投票

我同意 Daniel 的观点,即实际的命令脚本应该尽可能少地执行,但您也可以使用

os.popen4
在 Django 单元测试中直接测试它。

在单元测试中,您可以使用类似的命令

fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()

然后你可以分析结果的内容来测试你的Django命令是否成功。

© www.soinside.com 2019 - 2024. All rights reserved.