Python unittest-带有列表的断言字典

2024-05-28 20:54:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在为我的班级写一些测试时,我遇到了一个有趣的简单问题。我想断言有两本词典包含一些列表。但此列表的排序方式可能不同->;这将导致测试失败

示例:

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或排序列表。


Tags: testselfobj列表dictionary排序方式export
3条回答

你可以:

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)

您可以尝试PyHamcrest(示例已更正)

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

(第一个值2347实际上包装在一个隐式equal_to匹配器中。)

不如使用all

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

我在py.test中使用了类似的东西,但我认为它应该对您有用。


一位评论者指出,这个命令会把我搞得一团糟——很公平……那我就用套装吧。

相关问题 更多 >

    热门问题