我想模拟以下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:
...
我完全不知道如何模拟
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)
在计算功能中,我可以看到
cpses
是MagicMock类型。但是它不是可迭代的,之后的
for loop
只是跳过它。我以为通过将返回值设置为
[mock_cp]
,我会创建一个可迭代的列表吗? 最佳答案
您将返回值分配给canon_patch
的行略有错误。您在哪里:
canon_patch.objects.filter.return_value = [mock_cp]
它应该是:
canon_patch.return_value = [mock_cp]
canon_patch
已经是'objects.filter'的模型了。如果您调用
[mock_cp]
,则原始行将返回CanonPerson.objects.filter.objects.filter()
。如果您实际上想修补
CanonPerson
模型,那么您的修补程序行将类似于:with mock.patch('apps.dbank.models.CanonPerson') as canon_patch:
您可能还会发现,需要在使用它的位置(而不是从中导入它的位置)对它进行模拟。因此,假设您在名为
CanonPerson
的模块中使用my_module
,则测试中的补丁代码可能如下所示:with mock.patch('my_module.CanonPerson') as canon_patch: