【发布时间】:2019-08-23 13:35:34
【问题描述】:
我在 Django 中编写了一个测试,我是 using unittest.mock.ANY to ignore certain values in a dictionary。这是测试:
from django.test import TestCase
from django.contrib.auth import get_user_model
import unittest.mock as mock
class Example(TestCase):
def test_example(self):
user = get_user_model().objects.create_user(username='example')
result = {'user': user, 'number': 42}
self.assertEqual(
result,
{'user': mock.ANY, 'number': 42}
)
如果我运行这个测试,我希望它通过。相反,我得到了这个失败:
======================================================================
FAIL: test_example (example.tests.Example)
----------------------------------------------------------------------
Traceback (most recent call last):
File "example/tests.py", line 18, in test_example
'number': 42,
AssertionError: {'user': <User: example>, 'number': 42} != {'user': <ANY>, 'number': 42}
- {'number': 42, 'user': <User: example>}
? ^^^^^^^^^^^^^
+ {'number': 42, 'user': <ANY>}
? ^^^
为什么ANY 在这种情况下不起作用?它似乎适用于字符串和数字。
【问题讨论】:
-
如果换一种方式比较呢:
self.assertEqual({'user': mock.ANY, 'number': 42}, result)? -
assertEqual正在尝试评估user == mock.ANY,它被实现为user.__eq__(mock.ANY),而不是mock.ANY.__eq__(user)。type(user).__eq__似乎返回False而不是提升NotImplemented,这将允许尝试mock.ANY.__eq__。 -
按照 Goyo 的建议,翻转订单将允许首先尝试
mock.ANY.__eq__。 -
@chepner 听起来像是一个答案!
标签: python django python-unittest django-testing