UserDict不被单元测试视为dict

时间:2014-06-06 03:50:03

标签: python python-unittest

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吗?

3 个答案:

答案 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.