0

我有一个测试,我在其中嘲笑经理的过滤器调用。断言看起来像这样:

filter_mock.assert_called_once_with(type_id__in=[3, 4, 5, 6], finance=mock_finance, parent_transaction__date_posted=tran_date_posted)

并且正在测试的代码如下所示:

agregates = Balance.objects.filter(
            finance=self.finance,type_id__in=self.balance_types,
            parent_transaction__date_posted__lte=self.transaction_date_posted
        )

我认为,由于这些是 kwargs,因此顺序无关紧要,但测试失败了,即使每对的值都匹配。以下是我看到的错误:

AssertionError: 预期调用:filter(type_id__in=[3, 4, 5, 6], parent_transaction__date_posted=datetime.datetime(2015, 5, 29, 16, 22, 59, 532772), finance=) 实际调用:filter(type_id__in= [3, 4, 5, 6], 财务=, parent_transaction__date_posted__lte=datetime.datetime(2015, 5, 29, 16, 22, 59, 532772))

到底他妈发生了什么?kwarg 顺序应该无关紧要,即使我按照测试断言的顺序进行排序,测试仍然失败。

4

1 回答 1

3

你的钥匙不完全一样。在您的assert_called_with中,您拥有密钥parent_transaction__date_posted,但在您的代码中,您正在使用密钥parent_transaction__date_posted__lte。这就是导致您的测试失败的原因,而不是错误的排序。这是我自己的测试作为概念证明:

    >>> myobject.test(a=1, b=2)
    >>> mock_test.assert_called_with(b=2, a=1)
    OK
    >>> myobject.test(a=1, b__lte=2)
    >>> mock_test.assert_called_with(b=2, a=1)
    AssertionError: Expected call: test(a=1, b=2)
    Actual call: test(a=1, b__lte=2)

您将需要更正您的测试或代码以使它们匹配(包括 __lte 或不取决于您的需要)

于 2015-05-29T16:45:25.293 回答