【问题标题】:Testing Django Commands with Mock使用 Mock 测试 Django 命令
【发布时间】:2014-11-10 19:10:30
【问题描述】:

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

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)

当我运行它时,我不断收到AssertionError: Expected to be called once. Called 0 times.,我认为这是因为我实际上并没有在上下文中调用该模块,而是在call_command('djangocommand', my_option=True) 中调用它,但不应该嘲笑所有对该模块的调用在上下文处于活动状态时退出?如果没有,是否有人对如何进行这样的测试有建议?

【问题讨论】:

  • 你有错字:mock.package 应该是mock.patch

标签: python django unit-testing mocking


【解决方案1】:

您需要修补的引用是 django.core.management 中的“模块”属性引用。尝试在测试文件中模拟包引用不会更改 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)

【讨论】: