Search code examples
pythonunit-testingdictionaryassert

Python unittest - asserting dictionary with lists


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.


Solution

  • 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.)