【问题标题】:Django unit test mock queryset from related object来自相关对象的 Django 单元测试模拟查询集
【发布时间】:2018-04-16 07:20:03
【问题描述】:

我有以下功能:

import unittest
from unittest import mock


def get_payments(order):
    return order.payments.filter(status='complete').order_by('-date_added)

我想模拟 filter 方法和 order_by 来检查调用的参数。

我试过了:

class TestPayments(unittest.TestCase):
     @mock.patch('path.Order.payments.filter.order_by')
     @mock.patch('path.Order.payments.filter')
     def test_get_payments(self, mock1, mock2):
        mock1.assert_called_with(status='complete')
        mock2.assert_called_with('-date_added')

我尝试的另一个模拟:

@mock.patch('path.Payment.objects.filter.order_by')
@mock.patch('path.Payment.objects.filter')

@mock.patch('path.Order.payments.objects.filter.order_by')
@mock.patch('path.Order.payments.objects.filter')

在最后两个模拟中,我有一个错误,path.Order 不存在。 我已经对Payment.objects.filter() 之类的查询使用了直接模拟并且正在工作,但是从Order 之类的相关模型开始我失败了。

OrderPayment 之间的关系是您所期望的,一对多。

【问题讨论】:

  • 你可以使用 django TestCase 代替 python 的 unittest。 https://docs.djangoproject.com/en/1.11/topics/testing/overview/
  • 我正在使用 TestCase。你的链接也失效了。

标签: python django unit-testing django-queryset django-testing


【解决方案1】:

通过模拟对象我解决了这个问题。

    order = MagicMock(side_effect=Order())
    order.payments.filter.return_value = MagicMock(side_effect=Payment.objects.filter(id=0))
    order.payments.filter.return_value.order_by.return_value = [Payment()]

    order.payments.filter.assert_called_with(status='complete')
    order.payments.filter.return_value.order_by.assert_called_with('-date_updated')

【讨论】:

    【解决方案2】:

    要在这里解释发生了什么:QuerySet的方法,如filter()exclude()order_by()等返回一个QuerySet,这就是为什么他们可以链接 P>

    您第一次尝试是试图修补方法,就像他们将在一个包层次的东西。你落得这样做是不是修补的方法,但对于每个链接的方法,这是它是如何做嘲笑的返回值。 P>

    不幸的是,未在此多文档。当我遇到了这个问题,我有一些计算器的答案,帮助我,但我似乎无法再找到他们。 P>

    类似的问题(其中的答案没有真正提供一个交代): P>

    有图书馆,在那里,可以帮助你:mock-django提供了一个ORM嘲讽类。他们对mocking QuerySet methods做法是相当有趣的。我个人认为是非常有用的测试Django模型是Model Mommy,因为它可以帮助你创建的模型很容易嘲笑。 P>

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      相关资源
      最近更新 更多