Jor*_*ona 95

如果你正在使用一些覆盖工具,最好从代码中调用它:

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.
Run Code Online (Sandbox Code Playgroud)

  • 请注意如何涵盖测试https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/#testing (6认同)
  • @SWater嗨,据我了解,`django.test`中的`TestCase`使用测试数据库,请参见[此处](https://docs.djangoproject.com/en/4.1/topics/testing/overview/ #测试数据库) (3认同)
  • 上面的链接已损坏,请访问[此处](https://docs.djangoproject.com/en/dev/howto/custom-management-commands/#testing)提到的文档的最新版本。 (2认同)

Dan*_*man 20

您应该尽可能地使您的实际命令脚本,以便它只是在其他地方调用一个函数.然后可以通过单元测试或doctests正常测试该功能.

  • 不确定我是否同意这一点.如果我能做到这一点,我可能不会把它变成Django命令.我只是将它作为python程序运行.我制作Django命令的原因是为了获得所有Django基础设施. (4认同)

mad*_*rdi 12

你可以在github.com的例子中 看到这里看到的

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.")
Run Code Online (Sandbox Code Playgroud)


小智 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()
        )
Run Code Online (Sandbox Code Playgroud)

当你的 django-command 以如下方式使用时,这会起作用:

$ python manage.py my_command my_file.txt
Run Code Online (Sandbox Code Playgroud)