在自定义django-admin命令模块的handle方法内进行单元测试

1 投票
1 回答
1401 浏览
提问于 2025-04-17 14:41

我正在使用一个自定义的管理命令来运行一段超过500行的代码,这段代码包含多个函数定义,并且执行数据库查询。

管理命令文件:management/commands/talk.py

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self):
        def hello():
            print "Hello!"
        def my_god():
            print "OMG!"
        def main():
            hello()
            my_god()

我无法单独访问`handle`方法里的函数(比如通过 Command().handle.hello()),这样我就不能对它们进行单元测试,难道我错过了什么方法吗?

我的解决办法是把所有代码放在 handle 方法下,然后把这些代码放到 management/handle_command.py 文件里。接着在 management/commands/talk.py 中导入这些代码并在 handle 方法下运行 main。这样我就可以直接对 management/handle_command.py 中的函数进行单元测试了。

提议的管理命令文件示例:management/commands/talk.py

import my_project.my_app.management.handle_command
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self):
        my_project.my_app.management.handle_command.main()

我应该如何最好地处理自定义django-admin命令模块中 handle 方法里的函数测试呢?

1 个回答

2

第一部分:

管理/命令/talk.py

你需要在这个类里面定义函数,记得要用到 self

class Command(BaseCommand):
    def hello(self):
        print "Hello!"
    def my_god(self):
        print "OMG!"

    def handle(self):
        # this was def main():
        self.hello()
        self.my_god()

第二部分:

如果你想在其他地方使用这些方法,或者想把它们加到 unittest 里,最好不要把这些方法直接放在你的 Command 类里。如果你只是在 Command 类里使用它们(除了测试之外),那么你提到的测试方法看起来是最合理的。

撰写回答