Python的单元测试 - 断言字典,列表(Python unittest - asserting

2019-07-18 15:04发布

在写我的课的一些测试,我遇到有趣简单的问题。 我想assertDictEqual包含一些列表两个词典。 但这种列表可以不以同样的方式进行排序 - >导致测试失败

例:

def test_myobject_export_into_dictionary(self):
    obj = MyObject()
    resulting_dictionary = {
            'state': 2347,
            'neighbours': [1,2,3]
        }
    self.assertDictEqual(resulting_dictionary, obj.exportToDict())

这不能不时,这取决于列表中元素的顺序

FAIL: test_myobject_export_into_dictionary
------------------------------------
-  'neighbours': [1,2,3],
+  'neighbours': [1,3,2],

任何想法如何用简单的方法断言呢?

我想使用set ,而不是list或比较之前排序列表。

Answer 1:

您可以尝试PyHamcrest (例校正)

assert_that(obj.exportToDict(), has_entries(
                                    { 'state': 2347,
                                      'neighbours': contains_inanyorder(1,2,3) }))

(第一个值2347实际上得到包裹在一个隐式equal_to匹配器。)



Answer 2:

你可以做:

a = {i:sorted(j) if isinstance(j, list) else j for i,j in resulting_dictionary.iteritems()}
b = {i:sorted(j) if isinstance(j, list) else j for i,j in obj.exportToDict().iteritems()}
self.assertDictEqual(a, b)


Answer 3:

如何使用all

assert all( (k,v) in resulting_dictionary.iteritems() 
            for (k,v) in obj.exportToDict().iteritems() )

我用这样的事情与py.test,但我认为它应该为你工作。


一个评论者指出,为了将螺丝我在这里---不够公平...我只是使用集合,然后。



Answer 4:

也许你可以检查分开两个元素:

    obj_dict = obj.exportToDict()
    self.assertEqual(resulting_dictionary['state'], obj_dict['state'])
    self.assertCountEqual(resulting_dictionary['neighbours'], obj_dict['neighbours'])


文章来源: Python unittest - asserting dictionary with lists