在写我的课的一些测试,我遇到有趣简单的问题。 我想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
或比较之前排序列表。
您可以尝试PyHamcrest (例校正)
assert_that(obj.exportToDict(), has_entries(
{ 'state': 2347,
'neighbours': contains_inanyorder(1,2,3) }))
(第一个值2347实际上得到包裹在一个隐式equal_to
匹配器。)
你可以做:
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)
如何使用all
:
assert all( (k,v) in resulting_dictionary.iteritems()
for (k,v) in obj.exportToDict().iteritems() )
我用这样的事情与py.test,但我认为它应该为你工作。
一个评论者指出,为了将螺丝我在这里---不够公平...我只是使用集合,然后。
也许你可以检查分开两个元素:
obj_dict = obj.exportToDict()
self.assertEqual(resulting_dictionary['state'], obj_dict['state'])
self.assertCountEqual(resulting_dictionary['neighbours'], obj_dict['neighbours'])