我在 Django 中编写了一个测试,我正在使用unittest.mock.ANY
来忽略字典中的某些值。这是测试:
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
不起作用?它似乎适用于字符串和数字。
assertEqual
在比较其两个参数的过程中,计算表达式user == mock.ANY
。在标准方式中,left参数确定哪个函数实际实现==
。在这种情况下,您有user.__eq__(mock.ANY)
.似乎无论user
是什么类型,其__eq__
方法都只是为意外类型返回False
。如果它提出NotImplemented
,语言将回退到mock.ANY.__eq__(user)
,这可能会返回True
。
如果将呼叫更改为
self.assertEqual(
{'user': mock.ANY, 'number': 42},
result,
)
然后,生成的比较mock.ANY == user
将按预期返回True
。