gpt4 book ai didi

python - 如何模拟 Django 模型查询

转载 作者:太空狗 更新时间:2023-10-30 02:30:30 24 4
gpt4 key购买 nike

我想模拟以下 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 循环 只是跳过它。我想通过将返回值设置为 [mock_cp] 我会创建一个可迭代列表?

最佳答案

将返回值赋给 canon_patch 的那一行有点错误。你在哪里:

canon_patch.objects.filter.return_value = [mock_cp]

应该是:

canon_patch.return_value = [mock_cp]

canon_patch 已经是“objects.filter”的模拟。

如果您调用 CanonPerson.objects.filter.objects.filter(),您的原始行将返回 [mock_cp]

如果你真的想修补 CanonPerson 模型,那么你的修补线看起来像这样:

with mock.patch('apps.dbank.models.CanonPerson') as canon_patch:

您可能还会发现需要在使用它的位置模拟它,而不是在导入它的位置。因此,假设您在名为 my_module 的模块中使用 CanonPerson,您在测试中的补丁代码可能如下所示:

with mock.patch('my_module.CanonPerson') as canon_patch:

关于python - 如何模拟 Django 模型查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com