diff --git a/colander/__init__.py b/colander/__init__.py index 298283a..c433d3e 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -510,7 +510,10 @@ class Mapping(SchemaType): def _validate(self, node, value): try: - return dict(value) + if hasattr(value, 'items'): + return dict(value) + else: + raise TypeError('Does not implement dict-like functionality.') except Exception as e: raise Invalid(node, _('"${val}" is not a mapping type: ${err}', diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index 8884daf..1f22f64 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -529,10 +529,27 @@ class TestMapping(unittest.TestCase): def test_deserialize_not_a_mapping(self): node = DummySchemaNode(None) typ = self._makeOne() + + # None e = invalid_exc(typ.deserialize, node, None) self.assertTrue( e.msg.interpolate().startswith('"None" is not a mapping type')) + # list + e = invalid_exc(typ.deserialize, node, []) + self.assertTrue( + e.msg.interpolate().startswith('"[]" is not a mapping type')) + + # str + e = invalid_exc(typ.deserialize, node, "") + self.assertTrue( + e.msg.interpolate().startswith('"" is not a mapping type')) + + # tuple + e = invalid_exc(typ.deserialize, node, ()) + self.assertTrue( + e.msg.interpolate().startswith('"()" is not a mapping type')) + def test_deserialize_null(self): import colander node = DummySchemaNode(None)