为什么 unittest.mock.ANY 不能在 Django 对象上正常工作?



我在 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

最新更新