在为我的班级编写一些测试时,我遇到了一些有趣的简单问题。我想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
或排序列表。
答案 0 :(得分:7)
您可以尝试PyHamcrest (更正示例)
assert_that(obj.exportToDict(), has_entries(
{ 'state': 2347,
'neighbours': contains_inanyorder(1,2,3) }))
(第一个值2347实际上包含在隐式equal_to
匹配器中。)
答案 1 :(得分:0)
如何使用all
:
assert all( (k,v) in resulting_dictionary.iteritems()
for (k,v) in obj.exportToDict().iteritems() )
我在py.test中使用这样的东西,但我觉得它应该适合你。
一位评论者指出,这个命令会让我在这里搞砸 - 足够公平......那时我只是使用套装。
答案 2 :(得分:0)
你可以这样做:
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)
答案 3 :(得分:0)
也许您可以分别检查这两个元素:
obj_dict = obj.exportToDict()
self.assertEqual(resulting_dictionary['state'], obj_dict['state'])
self.assertCountEqual(resulting_dictionary['neighbours'], obj_dict['neighbours'])