Django单元测试来自相关对象的模拟查询集

jal*_*nga 7 python django unit-testing django-queryset django-testing

我有以下功能:

import unittest
from unittest import mock


def get_payments(order):
    return order.payments.filter(status='complete').order_by('-date_added)
Run Code Online (Sandbox Code Playgroud)

我想模拟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')
Run Code Online (Sandbox Code Playgroud)

我试过的另一个模拟:

@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')
Run Code Online (Sandbox Code Playgroud)

在最后两次嘲笑中,我有一个path.Order不存在的错误.我已经使用直接模拟来查询Payment.objects.filter()和工作,但从Order我失败的相关模型开始.

Order和之间的关系Payment是你期望的,一对多.

jal*_*nga 5

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

    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')
Run Code Online (Sandbox Code Playgroud)