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

时间:2009-08-17 08:04:48

标签: django testing django-admin custom-action

我创建了custom django-admin commands

但是,我不知道如何在standard django tests

中测试它

6 个答案:

答案 0 :(得分:86)

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

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.

答案 1 :(得分:19)

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

答案 2 :(得分:10)

你可以在github.com的例子中看到 see here

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.")

答案 3 :(得分:2)

要添加到此处已发布的内容中。如果您的django-admin命令将文件作为参数传递,则可以执行以下操作:

    val readyToGoFilter = DatastoreHelper.makeFilter("state",
      PropertyFilter.Operator.EQUAL,
      DatastoreHelper.makeValue("SUBMITTED"))

    val query = Query.newBuilder()
      .addKind(kind)
      .setFilter(readyToGoFilter)
      .build()

    val in = sc
      .withName("FindBatch")
      .datastore(projectId, query)

以如下方式使用django命令时,此方法有效:

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()
        )

答案 4 :(得分:0)

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

您可以使用以下方法进行测试:

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

答案 5 :(得分:-2)

我同意Daniel的观点,即实际的命令脚本应尽可能少,但您也可以使用os.popen4在Django单元测试中直接测试它。

在单元测试中,您可以使用

之类的命令
fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()

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