While writing some tests for my class, I encountered interesting simple problem. I would like to assertDictEqual two dictionaries containing some list. But this lists may not be sorted in a same way -> which results in failed test
Example:
def test_myobject_export_into_dictionary(self):
obj = MyObject()
resulting_dictionary = {
'state': 2347,
'neighbours': [1,2,3]
}
self.assertDictEqual(resulting_dictionary, obj.exportToDict())
This fail from time to time, depending on order of elements in list
FAIL: test_myobject_export_into_dictionary
------------------------------------
- 'neighbours': [1,2,3],
+ 'neighbours': [1,3,2],
Any ideas how to assert this in a simple way?
I was thinking about using set
instead of list
or sorting lists before comparison.
You might try PyHamcrest (Example corrected)
assert_that(obj.exportToDict(), has_entries(
{ 'state': 2347,
'neighbours': contains_inanyorder(1,2,3) }))
(The first value 2347 actually gets wrapped in an implicit equal_to
matcher.)
You can do:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With