import unittest
from UserDict import UserDict
class MyDict(UserDict):
def __init__(self, x):
UserDict.__init__(self, x=x)
class Test(unittest.TestCase):
def test_dict(self):
m = MyDict(42)
assert {'x': 42} == m # this passes
self.assertDictEqual({'x': 42}, m) # failure at here
if __name__ == '__main__':
unittest.main()
我得到了
AssertionError: Second argument is not a dictionary
我应该使用内置dict
作为基类,而不是UserDict
吗?
答案 0 :(得分:3)
问题是assertDictEqual()
首先检查两个参数是dict
个实例:
def assertDictEqual(self, d1, d2, msg=None):
self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
...
并且,UserDict
不是dict
的实例:
>>> m = UserDict(x=42)
>>> m
{'x': 42}
>>> isinstance(m, dict)
False
不要直接使用UserDict
类,而是使用包含真实字典的data
属性:
self.assertDictEqual({'x': 42}, m.data)
或者,正如其他人已经建议的那样,只需使用常规字典。
答案 1 :(得分:0)
问题是UserDict
实际上并不是dict
个对象,因为它是很久以前创建的,当时您无法从内置dict
类型继承。根据{{3}}:
[UserDict]已经在很大程度上取代了直接从
dict
继承子类的能力......
所以我可能只是从dict
继承并完成它;我没有看到UserDict
提供的任何功能。
请注意,我也会亲自审问UserDict
* ,因为模块名称为doc,而且令人讨厌。
* 我知道在八分钟前我才知道。
答案 2 :(得分:0)
来自Python unittess source
def assertDictEqual(self, d1, d2, msg=None):
self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')
这两个参数必须是dict的实例。
不幸的是,UserDict实例不是dict的实例
assert isinstance(m, dict) # this is False
正如文档https://docs.python.org/2/library/userdict.html#module-UserDict所说,您可以使用m.data返回真正的字典。
IterableUserDict.data
A real dictionary used to store the contents of the UserDict class.