Hou*_*man 4 python django unit-testing python-mock
我想嘲笑以下CanonPerson模型
def compute(self, is_send_emails, test_email_address):
cpses = CanonPerson.objects.filter(persons__vpd=6,
persons__country="United States",
persons__role__icontains=';IX;').prefetch_related("persons").using("global")
for cp in cpses:
...
Run Code Online (Sandbox Code Playgroud)
我很CanonPerson.objects.filter遗憾如何模仿以返回一个可交换的集合,以便我可以继续.
这是我到目前为止所做的:
def test_X_count(self):
with mock.patch('apps.dbank.models.CanonPerson.objects.filter') as canon_patch:
mock_cp = mock.MagicMock(spec=CanonPerson)
mock_person = mock.MagicMock(spec=Person)
mock_person.vpd = 6
mock_cp.country = "United States"
mock_cp.role = ";IX;"
mock_cp.persons.add(mock_person)
canon_patch.objects.filter.return_value = [mock_cp] // ???
oi = OptinInvites()
oi.compute(False, None)
oi.get_most_recent_email.assert_called_once_with(1)
Run Code Online (Sandbox Code Playgroud)
在计算功能中,我可以看到cpses是MagicMock类型.然而,它不可迭代,for loop之后,只是跳过它.我想通过设置返回值,[mock_cp]我会创建一个可迭代列表?
您为其指定返回值的行canon_patch略有错误.你在哪里:
canon_patch.objects.filter.return_value = [mock_cp]
Run Code Online (Sandbox Code Playgroud)
它应该是:
canon_patch.return_value = [mock_cp]
Run Code Online (Sandbox Code Playgroud)
canon_patch 已经是'objects.filter'的模拟.
[mock_cp]如果你打电话,原来的线路将会返回CanonPerson.objects.filter.objects.filter().
如果你真的想要修补CanonPerson模型,那么你的补丁线看起来像:
with mock.patch('apps.dbank.models.CanonPerson') as canon_patch:
Run Code Online (Sandbox Code Playgroud)
您可能还会发现需要在正在使用的位置模拟它,而不是从中导入它的位置.因此,假设您在测试中使用CanonPerson名为my_module补丁代码的模块,可能如下所示:
with mock.patch('my_module.CanonPerson') as canon_patch:
Run Code Online (Sandbox Code Playgroud)