我使用 Mock 来替换 Django Model,其配置如下:
>>> config = {'objects.filter.return_value.count.return_value': 1}
>>> MockModel = Mock(**config)
我可以查询一些值,然后对结果调用 .count()
:
>>> # This works as expected
>>> MockModel.objects.filter(foo='bar').count()
1
但是,当我断言调用了这些方法时,Mock 会引发 TypeError
因为
count
是Mock的call
的一个方法:
>>> MockModel.assert_has_calls([
call.objects.filter(foo='bar'),
call.objects.filter().count(),
])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-78-bf4e954d856f> in <module>()
1 MockModel.assert_has_calls([
2 call.objects.filter(foo='bar'),
----> 3 call.objects.filter().count()
4 ])
TypeError: count() takes exactly one argument (0 given)
不过,您可以看到此调用确实存在于 mock_calls
中:
>>> MockModel.mock_calls
[
call.trait_names(),
call._getAttributeNames(),
call.objects.filter(foo='bar'),
call.objects.filter().count(), # How do you test for this?
...
]
所以我的问题是这样的:如何断言在模拟 Django QuerySet 上调用了 count()
?
最佳答案
call
也是一个 tuple
,因此可以与 tuple
进行比较:
>>> MockModel.assert_has_calls([
call.objects.filter(foo='bar'),
('objects.filter().count',),
])
您可以确认这一点:
>>> map(tuple, MockModel.mock_calls)
> [('objects.filter', (), {'foo': 'bar'}), ('objects.filter().count', (), {})]
来源:https://code.google.com/p/mock/source/browse/mock.py#1988
关于python - 如何断言 Django 的 QuerySet.count() 方法在 Mock 上被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865049/