【发布时间】:2014-12-20 05:45:42
【问题描述】:
我想模拟以下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] 我会创建一个可迭代列表?
【问题讨论】:
-
尝试使用mock_django。也许对你有帮助。
-
为什么不在测试中创建一些实际数据?这是做事的正常方式。或者使用factory boy之类的东西。
-
想要模拟 django 模型的一个原因是,如果您想编写非常快速的单元测试。如果您想编写更完整的集成测试,那么不模拟模型非常好。这两种方法各有千秋。
标签: python django unit-testing python-mock