1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/python/mock-1.0.0/tests/testmagicmethods.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,486 @@ 1.4 +# Copyright (C) 2007-2012 Michael Foord & the mock team 1.5 +# E-mail: fuzzyman AT voidspace DOT org DOT uk 1.6 +# http://www.voidspace.org.uk/python/mock/ 1.7 + 1.8 +from tests.support import unittest2, inPy3k 1.9 + 1.10 +try: 1.11 + unicode 1.12 +except NameError: 1.13 + # Python 3 1.14 + unicode = str 1.15 + long = int 1.16 + 1.17 +import inspect 1.18 +import sys 1.19 +from mock import Mock, MagicMock, _magics 1.20 + 1.21 + 1.22 + 1.23 +class TestMockingMagicMethods(unittest2.TestCase): 1.24 + 1.25 + def test_deleting_magic_methods(self): 1.26 + mock = Mock() 1.27 + self.assertFalse(hasattr(mock, '__getitem__')) 1.28 + 1.29 + mock.__getitem__ = Mock() 1.30 + self.assertTrue(hasattr(mock, '__getitem__')) 1.31 + 1.32 + del mock.__getitem__ 1.33 + self.assertFalse(hasattr(mock, '__getitem__')) 1.34 + 1.35 + 1.36 + def test_magicmock_del(self): 1.37 + mock = MagicMock() 1.38 + # before using getitem 1.39 + del mock.__getitem__ 1.40 + self.assertRaises(TypeError, lambda: mock['foo']) 1.41 + 1.42 + mock = MagicMock() 1.43 + # this time use it first 1.44 + mock['foo'] 1.45 + del mock.__getitem__ 1.46 + self.assertRaises(TypeError, lambda: mock['foo']) 1.47 + 1.48 + 1.49 + def test_magic_method_wrapping(self): 1.50 + mock = Mock() 1.51 + def f(self, name): 1.52 + return self, 'fish' 1.53 + 1.54 + mock.__getitem__ = f 1.55 + self.assertFalse(mock.__getitem__ is f) 1.56 + self.assertEqual(mock['foo'], (mock, 'fish')) 1.57 + self.assertEqual(mock.__getitem__('foo'), (mock, 'fish')) 1.58 + 1.59 + mock.__getitem__ = mock 1.60 + self.assertTrue(mock.__getitem__ is mock) 1.61 + 1.62 + 1.63 + def test_magic_methods_isolated_between_mocks(self): 1.64 + mock1 = Mock() 1.65 + mock2 = Mock() 1.66 + 1.67 + mock1.__iter__ = Mock(return_value=iter([])) 1.68 + self.assertEqual(list(mock1), []) 1.69 + self.assertRaises(TypeError, lambda: list(mock2)) 1.70 + 1.71 + 1.72 + def test_repr(self): 1.73 + mock = Mock() 1.74 + self.assertEqual(repr(mock), "<Mock id='%s'>" % id(mock)) 1.75 + mock.__repr__ = lambda s: 'foo' 1.76 + self.assertEqual(repr(mock), 'foo') 1.77 + 1.78 + 1.79 + def test_str(self): 1.80 + mock = Mock() 1.81 + self.assertEqual(str(mock), object.__str__(mock)) 1.82 + mock.__str__ = lambda s: 'foo' 1.83 + self.assertEqual(str(mock), 'foo') 1.84 + 1.85 + 1.86 + @unittest2.skipIf(inPy3k, "no unicode in Python 3") 1.87 + def test_unicode(self): 1.88 + mock = Mock() 1.89 + self.assertEqual(unicode(mock), unicode(str(mock))) 1.90 + 1.91 + mock.__unicode__ = lambda s: unicode('foo') 1.92 + self.assertEqual(unicode(mock), unicode('foo')) 1.93 + 1.94 + 1.95 + def test_dict_methods(self): 1.96 + mock = Mock() 1.97 + 1.98 + self.assertRaises(TypeError, lambda: mock['foo']) 1.99 + def _del(): 1.100 + del mock['foo'] 1.101 + def _set(): 1.102 + mock['foo'] = 3 1.103 + self.assertRaises(TypeError, _del) 1.104 + self.assertRaises(TypeError, _set) 1.105 + 1.106 + _dict = {} 1.107 + def getitem(s, name): 1.108 + return _dict[name] 1.109 + def setitem(s, name, value): 1.110 + _dict[name] = value 1.111 + def delitem(s, name): 1.112 + del _dict[name] 1.113 + 1.114 + mock.__setitem__ = setitem 1.115 + mock.__getitem__ = getitem 1.116 + mock.__delitem__ = delitem 1.117 + 1.118 + self.assertRaises(KeyError, lambda: mock['foo']) 1.119 + mock['foo'] = 'bar' 1.120 + self.assertEqual(_dict, {'foo': 'bar'}) 1.121 + self.assertEqual(mock['foo'], 'bar') 1.122 + del mock['foo'] 1.123 + self.assertEqual(_dict, {}) 1.124 + 1.125 + 1.126 + def test_numeric(self): 1.127 + original = mock = Mock() 1.128 + mock.value = 0 1.129 + 1.130 + self.assertRaises(TypeError, lambda: mock + 3) 1.131 + 1.132 + def add(self, other): 1.133 + mock.value += other 1.134 + return self 1.135 + mock.__add__ = add 1.136 + self.assertEqual(mock + 3, mock) 1.137 + self.assertEqual(mock.value, 3) 1.138 + 1.139 + del mock.__add__ 1.140 + def iadd(mock): 1.141 + mock += 3 1.142 + self.assertRaises(TypeError, iadd, mock) 1.143 + mock.__iadd__ = add 1.144 + mock += 6 1.145 + self.assertEqual(mock, original) 1.146 + self.assertEqual(mock.value, 9) 1.147 + 1.148 + self.assertRaises(TypeError, lambda: 3 + mock) 1.149 + mock.__radd__ = add 1.150 + self.assertEqual(7 + mock, mock) 1.151 + self.assertEqual(mock.value, 16) 1.152 + 1.153 + 1.154 + @unittest2.skipIf(inPy3k, 'no truediv in Python 3') 1.155 + def test_truediv(self): 1.156 + mock = MagicMock() 1.157 + mock.__truediv__.return_value = 6 1.158 + 1.159 + context = {'mock': mock} 1.160 + code = 'from __future__ import division\nresult = mock / 7\n' 1.161 + exec(code, context) 1.162 + self.assertEqual(context['result'], 6) 1.163 + 1.164 + mock.__rtruediv__.return_value = 3 1.165 + code = 'from __future__ import division\nresult = 2 / mock\n' 1.166 + exec(code, context) 1.167 + self.assertEqual(context['result'], 3) 1.168 + 1.169 + 1.170 + @unittest2.skipIf(not inPy3k, 'truediv is available in Python 2') 1.171 + def test_no_truediv(self): 1.172 + self.assertRaises( 1.173 + AttributeError, getattr, MagicMock(), '__truediv__' 1.174 + ) 1.175 + self.assertRaises( 1.176 + AttributeError, getattr, MagicMock(), '__rtruediv__' 1.177 + ) 1.178 + 1.179 + 1.180 + def test_hash(self): 1.181 + mock = Mock() 1.182 + # test delegation 1.183 + self.assertEqual(hash(mock), Mock.__hash__(mock)) 1.184 + 1.185 + def _hash(s): 1.186 + return 3 1.187 + mock.__hash__ = _hash 1.188 + self.assertEqual(hash(mock), 3) 1.189 + 1.190 + 1.191 + def test_nonzero(self): 1.192 + m = Mock() 1.193 + self.assertTrue(bool(m)) 1.194 + 1.195 + nonzero = lambda s: False 1.196 + if not inPy3k: 1.197 + m.__nonzero__ = nonzero 1.198 + else: 1.199 + m.__bool__ = nonzero 1.200 + 1.201 + self.assertFalse(bool(m)) 1.202 + 1.203 + 1.204 + def test_comparison(self): 1.205 + # note: this test fails with Jython 2.5.1 due to a Jython bug 1.206 + # it is fixed in jython 2.5.2 1.207 + if not inPy3k: 1.208 + # incomparable in Python 3 1.209 + self. assertEqual(Mock() < 3, object() < 3) 1.210 + self. assertEqual(Mock() > 3, object() > 3) 1.211 + self. assertEqual(Mock() <= 3, object() <= 3) 1.212 + self. assertEqual(Mock() >= 3, object() >= 3) 1.213 + else: 1.214 + self.assertRaises(TypeError, lambda: MagicMock() < object()) 1.215 + self.assertRaises(TypeError, lambda: object() < MagicMock()) 1.216 + self.assertRaises(TypeError, lambda: MagicMock() < MagicMock()) 1.217 + self.assertRaises(TypeError, lambda: MagicMock() > object()) 1.218 + self.assertRaises(TypeError, lambda: object() > MagicMock()) 1.219 + self.assertRaises(TypeError, lambda: MagicMock() > MagicMock()) 1.220 + self.assertRaises(TypeError, lambda: MagicMock() <= object()) 1.221 + self.assertRaises(TypeError, lambda: object() <= MagicMock()) 1.222 + self.assertRaises(TypeError, lambda: MagicMock() <= MagicMock()) 1.223 + self.assertRaises(TypeError, lambda: MagicMock() >= object()) 1.224 + self.assertRaises(TypeError, lambda: object() >= MagicMock()) 1.225 + self.assertRaises(TypeError, lambda: MagicMock() >= MagicMock()) 1.226 + 1.227 + mock = Mock() 1.228 + def comp(s, o): 1.229 + return True 1.230 + mock.__lt__ = mock.__gt__ = mock.__le__ = mock.__ge__ = comp 1.231 + self. assertTrue(mock < 3) 1.232 + self. assertTrue(mock > 3) 1.233 + self. assertTrue(mock <= 3) 1.234 + self. assertTrue(mock >= 3) 1.235 + 1.236 + 1.237 + def test_equality(self): 1.238 + for mock in Mock(), MagicMock(): 1.239 + self.assertEqual(mock == mock, True) 1.240 + self.assertIsInstance(mock == mock, bool) 1.241 + self.assertEqual(mock != mock, False) 1.242 + self.assertIsInstance(mock != mock, bool) 1.243 + self.assertEqual(mock == object(), False) 1.244 + self.assertEqual(mock != object(), True) 1.245 + 1.246 + def eq(self, other): 1.247 + return other == 3 1.248 + mock.__eq__ = eq 1.249 + self.assertTrue(mock == 3) 1.250 + self.assertFalse(mock == 4) 1.251 + 1.252 + def ne(self, other): 1.253 + return other == 3 1.254 + mock.__ne__ = ne 1.255 + self.assertTrue(mock != 3) 1.256 + self.assertFalse(mock != 4) 1.257 + 1.258 + mock = MagicMock() 1.259 + mock.__eq__.return_value = True 1.260 + self.assertIsInstance(mock == 3, bool) 1.261 + self.assertEqual(mock == 3, True) 1.262 + 1.263 + mock.__ne__.return_value = False 1.264 + self.assertIsInstance(mock != 3, bool) 1.265 + self.assertEqual(mock != 3, False) 1.266 + 1.267 + 1.268 + def test_len_contains_iter(self): 1.269 + mock = Mock() 1.270 + 1.271 + self.assertRaises(TypeError, len, mock) 1.272 + self.assertRaises(TypeError, iter, mock) 1.273 + self.assertRaises(TypeError, lambda: 'foo' in mock) 1.274 + 1.275 + mock.__len__ = lambda s: 6 1.276 + self.assertEqual(len(mock), 6) 1.277 + 1.278 + mock.__contains__ = lambda s, o: o == 3 1.279 + self.assertTrue(3 in mock) 1.280 + self.assertFalse(6 in mock) 1.281 + 1.282 + mock.__iter__ = lambda s: iter('foobarbaz') 1.283 + self.assertEqual(list(mock), list('foobarbaz')) 1.284 + 1.285 + 1.286 + def test_magicmock(self): 1.287 + mock = MagicMock() 1.288 + 1.289 + mock.__iter__.return_value = iter([1, 2, 3]) 1.290 + self.assertEqual(list(mock), [1, 2, 3]) 1.291 + 1.292 + name = '__nonzero__' 1.293 + other = '__bool__' 1.294 + if inPy3k: 1.295 + name, other = other, name 1.296 + getattr(mock, name).return_value = False 1.297 + self.assertFalse(hasattr(mock, other)) 1.298 + self.assertFalse(bool(mock)) 1.299 + 1.300 + for entry in _magics: 1.301 + self.assertTrue(hasattr(mock, entry)) 1.302 + self.assertFalse(hasattr(mock, '__imaginery__')) 1.303 + 1.304 + 1.305 + def test_magic_mock_equality(self): 1.306 + mock = MagicMock() 1.307 + self.assertIsInstance(mock == object(), bool) 1.308 + self.assertIsInstance(mock != object(), bool) 1.309 + 1.310 + self.assertEqual(mock == object(), False) 1.311 + self.assertEqual(mock != object(), True) 1.312 + self.assertEqual(mock == mock, True) 1.313 + self.assertEqual(mock != mock, False) 1.314 + 1.315 + 1.316 + def test_magicmock_defaults(self): 1.317 + mock = MagicMock() 1.318 + self.assertEqual(int(mock), 1) 1.319 + self.assertEqual(complex(mock), 1j) 1.320 + self.assertEqual(float(mock), 1.0) 1.321 + self.assertEqual(long(mock), long(1)) 1.322 + self.assertNotIn(object(), mock) 1.323 + self.assertEqual(len(mock), 0) 1.324 + self.assertEqual(list(mock), []) 1.325 + self.assertEqual(hash(mock), object.__hash__(mock)) 1.326 + self.assertEqual(str(mock), object.__str__(mock)) 1.327 + self.assertEqual(unicode(mock), object.__str__(mock)) 1.328 + self.assertIsInstance(unicode(mock), unicode) 1.329 + self.assertTrue(bool(mock)) 1.330 + if not inPy3k: 1.331 + self.assertEqual(oct(mock), '1') 1.332 + else: 1.333 + # in Python 3 oct and hex use __index__ 1.334 + # so these tests are for __index__ in py3k 1.335 + self.assertEqual(oct(mock), '0o1') 1.336 + self.assertEqual(hex(mock), '0x1') 1.337 + # how to test __sizeof__ ? 1.338 + 1.339 + 1.340 + @unittest2.skipIf(inPy3k, "no __cmp__ in Python 3") 1.341 + def test_non_default_magic_methods(self): 1.342 + mock = MagicMock() 1.343 + self.assertRaises(AttributeError, lambda: mock.__cmp__) 1.344 + 1.345 + mock = Mock() 1.346 + mock.__cmp__ = lambda s, o: 0 1.347 + 1.348 + self.assertEqual(mock, object()) 1.349 + 1.350 + 1.351 + def test_magic_methods_and_spec(self): 1.352 + class Iterable(object): 1.353 + def __iter__(self): 1.354 + pass 1.355 + 1.356 + mock = Mock(spec=Iterable) 1.357 + self.assertRaises(AttributeError, lambda: mock.__iter__) 1.358 + 1.359 + mock.__iter__ = Mock(return_value=iter([])) 1.360 + self.assertEqual(list(mock), []) 1.361 + 1.362 + class NonIterable(object): 1.363 + pass 1.364 + mock = Mock(spec=NonIterable) 1.365 + self.assertRaises(AttributeError, lambda: mock.__iter__) 1.366 + 1.367 + def set_int(): 1.368 + mock.__int__ = Mock(return_value=iter([])) 1.369 + self.assertRaises(AttributeError, set_int) 1.370 + 1.371 + mock = MagicMock(spec=Iterable) 1.372 + self.assertEqual(list(mock), []) 1.373 + self.assertRaises(AttributeError, set_int) 1.374 + 1.375 + 1.376 + def test_magic_methods_and_spec_set(self): 1.377 + class Iterable(object): 1.378 + def __iter__(self): 1.379 + pass 1.380 + 1.381 + mock = Mock(spec_set=Iterable) 1.382 + self.assertRaises(AttributeError, lambda: mock.__iter__) 1.383 + 1.384 + mock.__iter__ = Mock(return_value=iter([])) 1.385 + self.assertEqual(list(mock), []) 1.386 + 1.387 + class NonIterable(object): 1.388 + pass 1.389 + mock = Mock(spec_set=NonIterable) 1.390 + self.assertRaises(AttributeError, lambda: mock.__iter__) 1.391 + 1.392 + def set_int(): 1.393 + mock.__int__ = Mock(return_value=iter([])) 1.394 + self.assertRaises(AttributeError, set_int) 1.395 + 1.396 + mock = MagicMock(spec_set=Iterable) 1.397 + self.assertEqual(list(mock), []) 1.398 + self.assertRaises(AttributeError, set_int) 1.399 + 1.400 + 1.401 + def test_setting_unsupported_magic_method(self): 1.402 + mock = MagicMock() 1.403 + def set_setattr(): 1.404 + mock.__setattr__ = lambda self, name: None 1.405 + self.assertRaisesRegexp(AttributeError, 1.406 + "Attempting to set unsupported magic method '__setattr__'.", 1.407 + set_setattr 1.408 + ) 1.409 + 1.410 + 1.411 + def test_attributes_and_return_value(self): 1.412 + mock = MagicMock() 1.413 + attr = mock.foo 1.414 + def _get_type(obj): 1.415 + # the type of every mock (or magicmock) is a custom subclass 1.416 + # so the real type is the second in the mro 1.417 + return type(obj).__mro__[1] 1.418 + self.assertEqual(_get_type(attr), MagicMock) 1.419 + 1.420 + returned = mock() 1.421 + self.assertEqual(_get_type(returned), MagicMock) 1.422 + 1.423 + 1.424 + def test_magic_methods_are_magic_mocks(self): 1.425 + mock = MagicMock() 1.426 + self.assertIsInstance(mock.__getitem__, MagicMock) 1.427 + 1.428 + mock[1][2].__getitem__.return_value = 3 1.429 + self.assertEqual(mock[1][2][3], 3) 1.430 + 1.431 + 1.432 + def test_magic_method_reset_mock(self): 1.433 + mock = MagicMock() 1.434 + str(mock) 1.435 + self.assertTrue(mock.__str__.called) 1.436 + mock.reset_mock() 1.437 + self.assertFalse(mock.__str__.called) 1.438 + 1.439 + 1.440 + @unittest2.skipUnless(sys.version_info[:2] >= (2, 6), 1.441 + "__dir__ not available until Python 2.6 or later") 1.442 + def test_dir(self): 1.443 + # overriding the default implementation 1.444 + for mock in Mock(), MagicMock(): 1.445 + def _dir(self): 1.446 + return ['foo'] 1.447 + mock.__dir__ = _dir 1.448 + self.assertEqual(dir(mock), ['foo']) 1.449 + 1.450 + 1.451 + @unittest2.skipIf('PyPy' in sys.version, "This fails differently on pypy") 1.452 + def test_bound_methods(self): 1.453 + m = Mock() 1.454 + 1.455 + # XXXX should this be an expected failure instead? 1.456 + 1.457 + # this seems like it should work, but is hard to do without introducing 1.458 + # other api inconsistencies. Failure message could be better though. 1.459 + m.__iter__ = [3].__iter__ 1.460 + self.assertRaises(TypeError, iter, m) 1.461 + 1.462 + 1.463 + def test_magic_method_type(self): 1.464 + class Foo(MagicMock): 1.465 + pass 1.466 + 1.467 + foo = Foo() 1.468 + self.assertIsInstance(foo.__int__, Foo) 1.469 + 1.470 + 1.471 + def test_descriptor_from_class(self): 1.472 + m = MagicMock() 1.473 + type(m).__str__.return_value = 'foo' 1.474 + self.assertEqual(str(m), 'foo') 1.475 + 1.476 + 1.477 + def test_iterable_as_iter_return_value(self): 1.478 + m = MagicMock() 1.479 + m.__iter__.return_value = [1, 2, 3] 1.480 + self.assertEqual(list(m), [1, 2, 3]) 1.481 + self.assertEqual(list(m), [1, 2, 3]) 1.482 + 1.483 + m.__iter__.return_value = iter([4, 5, 6]) 1.484 + self.assertEqual(list(m), [4, 5, 6]) 1.485 + self.assertEqual(list(m), []) 1.486 + 1.487 + 1.488 +if __name__ == '__main__': 1.489 + unittest2.main()