用Mock测试Django命令

时间:2014-09-16 21:40:07

标签: 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)

当我运行它但是我一直得到AssertionError: Expected to be called once. Called 0 times.我认为这是因为我实际上并没有在上下文中调用模块,我在call_command('djangocommand', my_option=True)中调用它,但不应该全部调用当上下文处于活动状态时,此模块会被模拟出来吗?如果没有,是否有人建议如何进行这样的测试?

1 个答案:

答案 0 :(得分:4)

您需要修补的参考资料是'模块' 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)