使用 Mock 测试 Django 命令

djd*_*s23 5 python django unit-testing mocking

我有一个要测试的命令。它击中了外部服务,我想模拟出击中这些外部服务的函数调用,只检查它们是否使用正确的参数被调用。代码如下所示:

import mock
from django.core.management import call_command
from myapp.models import User

class TestCommands(TestCase):

    def test_mytest(self):
        import package

        users = User.objects.filter(can_user_service=True)

        with mock.patch.object(package, 'module'):
            call_command('djangocommand', my_option=True)
            package.module.assert_called_once_with(users)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我一直AssertionError: Expected to be called once. Called 0 times.认为这是因为我实际上并没有在上下文中调用该模块call_command('djangocommand', my_option=True),而是在. 如果没有,是否有人对如何进行此类测试有任何建议?

Sil*_*eed 4

您需要修补的引用是 django.core.management 中的“module”属性引用。尝试模拟测试文件中的包引用不会更改 django.core.management 中的引用。

你需要做类似的事情

import mock
from django.core.management import call_command
import django.core.management
from myapp.models import User

class TestCommands(TestCase):

    def test_mytest(self):

        users = User.objects.filter(can_user_service=True)

        with mock.patch.object(django.core.management, 'module'):
            call_command('djangocommand', my_option=True)
            django.core.management.module.assert_called_once_with(users)
Run Code Online (Sandbox Code Playgroud)