diff -r 5388fa98f7a3 Lib/unittest/mock.py --- a/Lib/unittest/mock.py Tue Sep 15 23:59:00 2015 +0200 +++ b/Lib/unittest/mock.py Wed Sep 16 22:59:56 2015 -0700 @@ -1557,8 +1557,12 @@ in_dict = _importer(in_dict) self.in_dict = in_dict # support any argument supported by dict(...) constructor - self.values = dict(values) - self.values.update(kwargs) + # values is a mapping + if hasattr(values, "items") and callable(values.items): + self.values = list(values.items()) + else: # values is an iterable + self.values = list(values) + self.values.extend(kwargs.items()) self.clear = clear self._original = None @@ -1615,8 +1619,8 @@ in_dict.update(values) except AttributeError: # dict like object with no update method - for key in values: - in_dict[key] = values[key] + for key, value in values: + in_dict[key] = value def _unpatch_dict(self): diff -r 5388fa98f7a3 Lib/unittest/test/testmock/testpatch.py --- a/Lib/unittest/test/testmock/testpatch.py Tue Sep 15 23:59:00 2015 +0200 +++ b/Lib/unittest/test/testmock/testpatch.py Wed Sep 16 22:59:56 2015 -0700 @@ -4,6 +4,7 @@ import os import sys +from collections import OrderedDict import unittest from unittest.test.testmock import support @@ -625,6 +626,30 @@ self.assertEqual(foo.values, original) + def test_patch_dict_with_orderddict(self): + foo = OrderedDict() + foo['a'] = object() + foo['b'] = 'something' + + original = foo.copy() + + update_values = zip('cdefghijklmnopqrstuvwxyz', range(26)) + + @patch.dict(foo, OrderedDict(update_values)) + def test(): + self.assertEqual(list(foo), sorted(foo)) + + test() + + self.assertEqual(foo, original) + + @patch.dict(foo, update_values) + def test(): + self.assertEqual(list(foo), sorted(foo)) + + test() + + self.assertEqual(foo, original) def test_name_preserved(self): foo = {}