我有一个我想测试的命令。它命中外部服务,我想模拟出这些外部服务的函数调用,只检查它们是否使用正确的参数调用。代码如下所示:
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)
中调用它,但不应该全部调用当上下文处于活动状态时,此模块会被模拟出来吗?如果没有,是否有人建议如何进行这样的测试?
答案 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)