![](/img/trans.png)
[英]Why Doesn't This Python/Django Unit Test with Mock Objects Work?
[英]Why doesn't unittest.mock.ANY work correctly with Django objects?
我已經在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__
類型,其__eq__
方法都會為意外類型簡單地返回False
。 如果改為引發NotImplemented
,則該語言將依賴於mock.ANY.__eq__(user)
,后者可以返回True
。
如果將呼叫更改為
self.assertEqual(
{'user': mock.ANY, 'number': 42},
result,
)
那么結果比較的mock.ANY == user
將按預期返回True
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.