python - 如何断言 Django 的 QuerySet.count() 方法在 Mock 上被调用?

标签 python django mocking

我使用 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/

相关文章:

python - 在哪里可以找到 itertools.combinations() 函数的源代码

django - 使用 https 访问 AWS elastic ip

python - 安装 python dateutil

java - 调用 FileWriter 的单元测试方法

mocking - 如何在 Mockito 中 stub Long.valueOf(String) ?

python - 对具有相等值的列表求和和聚合

python - 如何将 RGBA 元组的二维矩阵转换为 PIL 图像?

python - Scrapy 进程未成功抓取

django - 在Django View 中,order_by()不能与filter()一起使用

python - 如何模拟从函数导入但不存在于 sys.path 中的模块?