blob: 307b8b7657afa15dd20c9ce42b25a9dbef3888b6 [file] [log] [blame]
Michael Foord345266a2012-03-14 12:24:34 -07001import copy
Petter Strandmark47d94242018-10-28 21:37:10 +01002import re
Michael Foord345266a2012-03-14 12:24:34 -07003import sys
Robert Collinsca647ef2015-07-24 03:48:20 +12004import tempfile
Michael Foord345266a2012-03-14 12:24:34 -07005
6import unittest
7from unittest.test.testmock.support import is_instance
8from unittest import mock
9from unittest.mock import (
10 call, DEFAULT, patch, sentinel,
11 MagicMock, Mock, NonCallableMock,
Lisa Roach77b3b772019-05-20 09:19:53 -070012 NonCallableMagicMock, AsyncMock, _Call, _CallList,
Michael Foord345266a2012-03-14 12:24:34 -070013 create_autospec
14)
15
16
17class Iter(object):
18 def __init__(self):
19 self.thing = iter(['this', 'is', 'an', 'iter'])
20
21 def __iter__(self):
22 return self
23
24 def next(self):
25 return next(self.thing)
26
27 __next__ = next
28
29
Antoine Pitrou5c64df72013-02-03 00:23:58 +010030class Something(object):
Chris Withersadbf1782019-05-01 23:04:04 +010031 def meth(self, a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010032
33 @classmethod
Chris Withersadbf1782019-05-01 23:04:04 +010034 def cmeth(cls, a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010035
36 @staticmethod
Chris Withersadbf1782019-05-01 23:04:04 +010037 def smeth(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010038
Michael Foord345266a2012-03-14 12:24:34 -070039
40class MockTest(unittest.TestCase):
41
42 def test_all(self):
43 # if __all__ is badly defined then import * will raise an error
44 # We have to exec it because you can't import * inside a method
45 # in Python 3
Michael Foord83a16852012-03-14 12:58:46 -070046 exec("from unittest.mock import *")
Michael Foord345266a2012-03-14 12:24:34 -070047
48
49 def test_constructor(self):
50 mock = Mock()
51
52 self.assertFalse(mock.called, "called not initialised correctly")
53 self.assertEqual(mock.call_count, 0,
54 "call_count not initialised correctly")
55 self.assertTrue(is_instance(mock.return_value, Mock),
56 "return_value not initialised correctly")
57
58 self.assertEqual(mock.call_args, None,
59 "call_args not initialised correctly")
60 self.assertEqual(mock.call_args_list, [],
61 "call_args_list not initialised correctly")
62 self.assertEqual(mock.method_calls, [],
63 "method_calls not initialised correctly")
64
65 # Can't use hasattr for this test as it always returns True on a mock
Serhiy Storchaka5665bc52013-11-17 00:12:21 +020066 self.assertNotIn('_items', mock.__dict__,
Michael Foord345266a2012-03-14 12:24:34 -070067 "default mock should not have '_items' attribute")
68
69 self.assertIsNone(mock._mock_parent,
70 "parent not initialised correctly")
71 self.assertIsNone(mock._mock_methods,
72 "methods not initialised correctly")
73 self.assertEqual(mock._mock_children, {},
74 "children not initialised incorrectly")
75
76
77 def test_return_value_in_constructor(self):
78 mock = Mock(return_value=None)
79 self.assertIsNone(mock.return_value,
80 "return value in constructor not honoured")
81
82
Chris Withersadbf1782019-05-01 23:04:04 +010083 def test_change_return_value_via_delegate(self):
84 def f(): pass
85 mock = create_autospec(f)
86 mock.mock.return_value = 1
87 self.assertEqual(mock(), 1)
88
89
90 def test_change_side_effect_via_delegate(self):
91 def f(): pass
92 mock = create_autospec(f)
93 mock.mock.side_effect = TypeError()
94 with self.assertRaises(TypeError):
95 mock()
96
97
Michael Foord345266a2012-03-14 12:24:34 -070098 def test_repr(self):
99 mock = Mock(name='foo')
100 self.assertIn('foo', repr(mock))
101 self.assertIn("'%s'" % id(mock), repr(mock))
102
103 mocks = [(Mock(), 'mock'), (Mock(name='bar'), 'bar')]
104 for mock, name in mocks:
105 self.assertIn('%s.bar' % name, repr(mock.bar))
106 self.assertIn('%s.foo()' % name, repr(mock.foo()))
107 self.assertIn('%s.foo().bing' % name, repr(mock.foo().bing))
108 self.assertIn('%s()' % name, repr(mock()))
109 self.assertIn('%s()()' % name, repr(mock()()))
110 self.assertIn('%s()().foo.bar.baz().bing' % name,
111 repr(mock()().foo.bar.baz().bing))
112
113
114 def test_repr_with_spec(self):
115 class X(object):
116 pass
117
118 mock = Mock(spec=X)
119 self.assertIn(" spec='X' ", repr(mock))
120
121 mock = Mock(spec=X())
122 self.assertIn(" spec='X' ", repr(mock))
123
124 mock = Mock(spec_set=X)
125 self.assertIn(" spec_set='X' ", repr(mock))
126
127 mock = Mock(spec_set=X())
128 self.assertIn(" spec_set='X' ", repr(mock))
129
130 mock = Mock(spec=X, name='foo')
131 self.assertIn(" spec='X' ", repr(mock))
132 self.assertIn(" name='foo' ", repr(mock))
133
134 mock = Mock(name='foo')
135 self.assertNotIn("spec", repr(mock))
136
137 mock = Mock()
138 self.assertNotIn("spec", repr(mock))
139
140 mock = Mock(spec=['foo'])
141 self.assertNotIn("spec", repr(mock))
142
143
144 def test_side_effect(self):
145 mock = Mock()
146
147 def effect(*args, **kwargs):
148 raise SystemError('kablooie')
149
150 mock.side_effect = effect
151 self.assertRaises(SystemError, mock, 1, 2, fish=3)
152 mock.assert_called_with(1, 2, fish=3)
153
154 results = [1, 2, 3]
155 def effect():
156 return results.pop()
157 mock.side_effect = effect
158
159 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
160 "side effect not used correctly")
161
162 mock = Mock(side_effect=sentinel.SideEffect)
163 self.assertEqual(mock.side_effect, sentinel.SideEffect,
164 "side effect in constructor not used")
165
166 def side_effect():
167 return DEFAULT
168 mock = Mock(side_effect=side_effect, return_value=sentinel.RETURN)
169 self.assertEqual(mock(), sentinel.RETURN)
170
Michael Foord01bafdc2014-04-14 16:09:42 -0400171 def test_autospec_side_effect(self):
172 # Test for issue17826
173 results = [1, 2, 3]
174 def effect():
175 return results.pop()
Chris Withersadbf1782019-05-01 23:04:04 +0100176 def f(): pass
Michael Foord01bafdc2014-04-14 16:09:42 -0400177
178 mock = create_autospec(f)
179 mock.side_effect = [1, 2, 3]
180 self.assertEqual([mock(), mock(), mock()], [1, 2, 3],
181 "side effect not used correctly in create_autospec")
182 # Test where side effect is a callable
183 results = [1, 2, 3]
184 mock = create_autospec(f)
185 mock.side_effect = effect
186 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
187 "callable side effect not used correctly")
Michael Foord345266a2012-03-14 12:24:34 -0700188
Robert Collinsf58f88c2015-07-14 13:51:40 +1200189 def test_autospec_side_effect_exception(self):
190 # Test for issue 23661
Chris Withersadbf1782019-05-01 23:04:04 +0100191 def f(): pass
Robert Collinsf58f88c2015-07-14 13:51:40 +1200192
193 mock = create_autospec(f)
194 mock.side_effect = ValueError('Bazinga!')
195 self.assertRaisesRegex(ValueError, 'Bazinga!', mock)
196
Michael Foord345266a2012-03-14 12:24:34 -0700197
198 def test_reset_mock(self):
199 parent = Mock()
200 spec = ["something"]
201 mock = Mock(name="child", parent=parent, spec=spec)
202 mock(sentinel.Something, something=sentinel.SomethingElse)
203 something = mock.something
204 mock.something()
205 mock.side_effect = sentinel.SideEffect
206 return_value = mock.return_value
207 return_value()
208
209 mock.reset_mock()
210
211 self.assertEqual(mock._mock_name, "child",
212 "name incorrectly reset")
213 self.assertEqual(mock._mock_parent, parent,
214 "parent incorrectly reset")
215 self.assertEqual(mock._mock_methods, spec,
216 "methods incorrectly reset")
217
218 self.assertFalse(mock.called, "called not reset")
219 self.assertEqual(mock.call_count, 0, "call_count not reset")
220 self.assertEqual(mock.call_args, None, "call_args not reset")
221 self.assertEqual(mock.call_args_list, [], "call_args_list not reset")
222 self.assertEqual(mock.method_calls, [],
223 "method_calls not initialised correctly: %r != %r" %
224 (mock.method_calls, []))
225 self.assertEqual(mock.mock_calls, [])
226
227 self.assertEqual(mock.side_effect, sentinel.SideEffect,
228 "side_effect incorrectly reset")
229 self.assertEqual(mock.return_value, return_value,
230 "return_value incorrectly reset")
231 self.assertFalse(return_value.called, "return value mock not reset")
232 self.assertEqual(mock._mock_children, {'something': something},
233 "children reset incorrectly")
234 self.assertEqual(mock.something, something,
235 "children incorrectly cleared")
236 self.assertFalse(mock.something.called, "child not reset")
237
238
239 def test_reset_mock_recursion(self):
240 mock = Mock()
241 mock.return_value = mock
242
243 # used to cause recursion
244 mock.reset_mock()
245
Robert Collinsb37f43f2015-07-15 11:42:28 +1200246 def test_reset_mock_on_mock_open_issue_18622(self):
247 a = mock.mock_open()
248 a.reset_mock()
Michael Foord345266a2012-03-14 12:24:34 -0700249
250 def test_call(self):
251 mock = Mock()
252 self.assertTrue(is_instance(mock.return_value, Mock),
253 "Default return_value should be a Mock")
254
255 result = mock()
256 self.assertEqual(mock(), result,
257 "different result from consecutive calls")
258 mock.reset_mock()
259
260 ret_val = mock(sentinel.Arg)
261 self.assertTrue(mock.called, "called not set")
262 self.assertEqual(mock.call_count, 1, "call_count incoreect")
263 self.assertEqual(mock.call_args, ((sentinel.Arg,), {}),
264 "call_args not set")
Kumar Akshayb0df45e2019-03-22 13:40:40 +0530265 self.assertEqual(mock.call_args.args, (sentinel.Arg,),
266 "call_args not set")
267 self.assertEqual(mock.call_args.kwargs, {},
268 "call_args not set")
Michael Foord345266a2012-03-14 12:24:34 -0700269 self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})],
270 "call_args_list not initialised correctly")
271
272 mock.return_value = sentinel.ReturnValue
273 ret_val = mock(sentinel.Arg, key=sentinel.KeyArg)
274 self.assertEqual(ret_val, sentinel.ReturnValue,
275 "incorrect return value")
276
277 self.assertEqual(mock.call_count, 2, "call_count incorrect")
278 self.assertEqual(mock.call_args,
279 ((sentinel.Arg,), {'key': sentinel.KeyArg}),
280 "call_args not set")
281 self.assertEqual(mock.call_args_list, [
282 ((sentinel.Arg,), {}),
283 ((sentinel.Arg,), {'key': sentinel.KeyArg})
284 ],
285 "call_args_list not set")
286
287
288 def test_call_args_comparison(self):
289 mock = Mock()
290 mock()
291 mock(sentinel.Arg)
292 mock(kw=sentinel.Kwarg)
293 mock(sentinel.Arg, kw=sentinel.Kwarg)
294 self.assertEqual(mock.call_args_list, [
295 (),
296 ((sentinel.Arg,),),
297 ({"kw": sentinel.Kwarg},),
298 ((sentinel.Arg,), {"kw": sentinel.Kwarg})
299 ])
300 self.assertEqual(mock.call_args,
301 ((sentinel.Arg,), {"kw": sentinel.Kwarg}))
Kumar Akshayb0df45e2019-03-22 13:40:40 +0530302 self.assertEqual(mock.call_args.args, (sentinel.Arg,))
303 self.assertEqual(mock.call_args.kwargs, {"kw": sentinel.Kwarg})
Michael Foord345266a2012-03-14 12:24:34 -0700304
Berker Peksag3fc536f2015-09-09 23:35:25 +0300305 # Comparing call_args to a long sequence should not raise
306 # an exception. See issue 24857.
307 self.assertFalse(mock.call_args == "a long sequence")
Michael Foord345266a2012-03-14 12:24:34 -0700308
Berker Peksagce913872016-03-28 00:30:02 +0300309
310 def test_calls_equal_with_any(self):
Berker Peksagce913872016-03-28 00:30:02 +0300311 # Check that equality and non-equality is consistent even when
312 # comparing with mock.ANY
Serhiy Storchaka362f0582017-01-21 23:12:58 +0200313 mm = mock.MagicMock()
314 self.assertTrue(mm == mm)
315 self.assertFalse(mm != mm)
316 self.assertFalse(mm == mock.MagicMock())
317 self.assertTrue(mm != mock.MagicMock())
318 self.assertTrue(mm == mock.ANY)
319 self.assertFalse(mm != mock.ANY)
320 self.assertTrue(mock.ANY == mm)
321 self.assertFalse(mock.ANY != mm)
322
323 call1 = mock.call(mock.MagicMock())
324 call2 = mock.call(mock.ANY)
Berker Peksagce913872016-03-28 00:30:02 +0300325 self.assertTrue(call1 == call2)
326 self.assertFalse(call1 != call2)
Serhiy Storchaka362f0582017-01-21 23:12:58 +0200327 self.assertTrue(call2 == call1)
328 self.assertFalse(call2 != call1)
Berker Peksagce913872016-03-28 00:30:02 +0300329
330
Michael Foord345266a2012-03-14 12:24:34 -0700331 def test_assert_called_with(self):
332 mock = Mock()
333 mock()
334
335 # Will raise an exception if it fails
336 mock.assert_called_with()
337 self.assertRaises(AssertionError, mock.assert_called_with, 1)
338
339 mock.reset_mock()
340 self.assertRaises(AssertionError, mock.assert_called_with)
341
342 mock(1, 2, 3, a='fish', b='nothing')
343 mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
344
345
Berker Peksagce913872016-03-28 00:30:02 +0300346 def test_assert_called_with_any(self):
347 m = MagicMock()
348 m(MagicMock())
349 m.assert_called_with(mock.ANY)
350
351
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100352 def test_assert_called_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +0100353 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100354
355 mock = Mock(spec=f)
356
357 mock(1, b=2, c=3)
358 mock.assert_called_with(1, 2, 3)
359 mock.assert_called_with(a=1, b=2, c=3)
360 self.assertRaises(AssertionError, mock.assert_called_with,
361 1, b=3, c=2)
362 # Expected call doesn't match the spec's signature
363 with self.assertRaises(AssertionError) as cm:
364 mock.assert_called_with(e=8)
365 self.assertIsInstance(cm.exception.__cause__, TypeError)
366
367
368 def test_assert_called_with_method_spec(self):
369 def _check(mock):
370 mock(1, b=2, c=3)
371 mock.assert_called_with(1, 2, 3)
372 mock.assert_called_with(a=1, b=2, c=3)
373 self.assertRaises(AssertionError, mock.assert_called_with,
374 1, b=3, c=2)
375
376 mock = Mock(spec=Something().meth)
377 _check(mock)
378 mock = Mock(spec=Something.cmeth)
379 _check(mock)
380 mock = Mock(spec=Something().cmeth)
381 _check(mock)
382 mock = Mock(spec=Something.smeth)
383 _check(mock)
384 mock = Mock(spec=Something().smeth)
385 _check(mock)
386
387
Michael Foord345266a2012-03-14 12:24:34 -0700388 def test_assert_called_once_with(self):
389 mock = Mock()
390 mock()
391
392 # Will raise an exception if it fails
393 mock.assert_called_once_with()
394
395 mock()
396 self.assertRaises(AssertionError, mock.assert_called_once_with)
397
398 mock.reset_mock()
399 self.assertRaises(AssertionError, mock.assert_called_once_with)
400
401 mock('foo', 'bar', baz=2)
402 mock.assert_called_once_with('foo', 'bar', baz=2)
403
404 mock.reset_mock()
405 mock('foo', 'bar', baz=2)
406 self.assertRaises(
407 AssertionError,
408 lambda: mock.assert_called_once_with('bob', 'bar', baz=2)
409 )
410
Petter Strandmark47d94242018-10-28 21:37:10 +0100411 def test_assert_called_once_with_call_list(self):
412 m = Mock()
413 m(1)
414 m(2)
415 self.assertRaisesRegex(AssertionError,
416 re.escape("Calls: [call(1), call(2)]"),
417 lambda: m.assert_called_once_with(2))
418
Michael Foord345266a2012-03-14 12:24:34 -0700419
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100420 def test_assert_called_once_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +0100421 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100422
423 mock = Mock(spec=f)
424
425 mock(1, b=2, c=3)
426 mock.assert_called_once_with(1, 2, 3)
427 mock.assert_called_once_with(a=1, b=2, c=3)
428 self.assertRaises(AssertionError, mock.assert_called_once_with,
429 1, b=3, c=2)
430 # Expected call doesn't match the spec's signature
431 with self.assertRaises(AssertionError) as cm:
432 mock.assert_called_once_with(e=8)
433 self.assertIsInstance(cm.exception.__cause__, TypeError)
434 # Mock called more than once => always fails
435 mock(4, 5, 6)
436 self.assertRaises(AssertionError, mock.assert_called_once_with,
437 1, 2, 3)
438 self.assertRaises(AssertionError, mock.assert_called_once_with,
439 4, 5, 6)
440
441
Michael Foord345266a2012-03-14 12:24:34 -0700442 def test_attribute_access_returns_mocks(self):
443 mock = Mock()
444 something = mock.something
445 self.assertTrue(is_instance(something, Mock), "attribute isn't a mock")
446 self.assertEqual(mock.something, something,
447 "different attributes returned for same name")
448
449 # Usage example
450 mock = Mock()
451 mock.something.return_value = 3
452
453 self.assertEqual(mock.something(), 3, "method returned wrong value")
454 self.assertTrue(mock.something.called,
455 "method didn't record being called")
456
457
458 def test_attributes_have_name_and_parent_set(self):
459 mock = Mock()
460 something = mock.something
461
462 self.assertEqual(something._mock_name, "something",
463 "attribute name not set correctly")
464 self.assertEqual(something._mock_parent, mock,
465 "attribute parent not set correctly")
466
467
468 def test_method_calls_recorded(self):
469 mock = Mock()
470 mock.something(3, fish=None)
471 mock.something_else.something(6, cake=sentinel.Cake)
472
473 self.assertEqual(mock.something_else.method_calls,
474 [("something", (6,), {'cake': sentinel.Cake})],
475 "method calls not recorded correctly")
476 self.assertEqual(mock.method_calls, [
477 ("something", (3,), {'fish': None}),
478 ("something_else.something", (6,), {'cake': sentinel.Cake})
479 ],
480 "method calls not recorded correctly")
481
482
483 def test_method_calls_compare_easily(self):
484 mock = Mock()
485 mock.something()
486 self.assertEqual(mock.method_calls, [('something',)])
487 self.assertEqual(mock.method_calls, [('something', (), {})])
488
489 mock = Mock()
490 mock.something('different')
491 self.assertEqual(mock.method_calls, [('something', ('different',))])
492 self.assertEqual(mock.method_calls,
493 [('something', ('different',), {})])
494
495 mock = Mock()
496 mock.something(x=1)
497 self.assertEqual(mock.method_calls, [('something', {'x': 1})])
498 self.assertEqual(mock.method_calls, [('something', (), {'x': 1})])
499
500 mock = Mock()
501 mock.something('different', some='more')
502 self.assertEqual(mock.method_calls, [
503 ('something', ('different',), {'some': 'more'})
504 ])
505
506
507 def test_only_allowed_methods_exist(self):
508 for spec in ['something'], ('something',):
509 for arg in 'spec', 'spec_set':
510 mock = Mock(**{arg: spec})
511
512 # this should be allowed
513 mock.something
514 self.assertRaisesRegex(
515 AttributeError,
516 "Mock object has no attribute 'something_else'",
517 getattr, mock, 'something_else'
518 )
519
520
521 def test_from_spec(self):
522 class Something(object):
523 x = 3
524 __something__ = None
Chris Withersadbf1782019-05-01 23:04:04 +0100525 def y(self): pass
Michael Foord345266a2012-03-14 12:24:34 -0700526
527 def test_attributes(mock):
528 # should work
529 mock.x
530 mock.y
531 mock.__something__
532 self.assertRaisesRegex(
533 AttributeError,
534 "Mock object has no attribute 'z'",
535 getattr, mock, 'z'
536 )
537 self.assertRaisesRegex(
538 AttributeError,
539 "Mock object has no attribute '__foobar__'",
540 getattr, mock, '__foobar__'
541 )
542
543 test_attributes(Mock(spec=Something))
544 test_attributes(Mock(spec=Something()))
545
546
547 def test_wraps_calls(self):
548 real = Mock()
549
550 mock = Mock(wraps=real)
551 self.assertEqual(mock(), real())
552
553 real.reset_mock()
554
555 mock(1, 2, fish=3)
556 real.assert_called_with(1, 2, fish=3)
557
558
Mario Corcherof05df0a2018-12-08 11:25:02 +0000559 def test_wraps_prevents_automatic_creation_of_mocks(self):
560 class Real(object):
561 pass
562
563 real = Real()
564 mock = Mock(wraps=real)
565
566 self.assertRaises(AttributeError, lambda: mock.new_attr())
567
568
Michael Foord345266a2012-03-14 12:24:34 -0700569 def test_wraps_call_with_nondefault_return_value(self):
570 real = Mock()
571
572 mock = Mock(wraps=real)
573 mock.return_value = 3
574
575 self.assertEqual(mock(), 3)
576 self.assertFalse(real.called)
577
578
579 def test_wraps_attributes(self):
580 class Real(object):
581 attribute = Mock()
582
583 real = Real()
584
585 mock = Mock(wraps=real)
586 self.assertEqual(mock.attribute(), real.attribute())
587 self.assertRaises(AttributeError, lambda: mock.fish)
588
589 self.assertNotEqual(mock.attribute, real.attribute)
590 result = mock.attribute.frog(1, 2, fish=3)
591 Real.attribute.frog.assert_called_with(1, 2, fish=3)
592 self.assertEqual(result, Real.attribute.frog())
593
594
Mario Corcherof05df0a2018-12-08 11:25:02 +0000595 def test_customize_wrapped_object_with_side_effect_iterable_with_default(self):
596 class Real(object):
597 def method(self):
598 return sentinel.ORIGINAL_VALUE
599
600 real = Real()
601 mock = Mock(wraps=real)
602 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
603
604 self.assertEqual(mock.method(), sentinel.VALUE1)
605 self.assertEqual(mock.method(), sentinel.ORIGINAL_VALUE)
606 self.assertRaises(StopIteration, mock.method)
607
608
609 def test_customize_wrapped_object_with_side_effect_iterable(self):
610 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100611 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000612
613 real = Real()
614 mock = Mock(wraps=real)
615 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
616
617 self.assertEqual(mock.method(), sentinel.VALUE1)
618 self.assertEqual(mock.method(), sentinel.VALUE2)
619 self.assertRaises(StopIteration, mock.method)
620
621
622 def test_customize_wrapped_object_with_side_effect_exception(self):
623 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100624 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000625
626 real = Real()
627 mock = Mock(wraps=real)
628 mock.method.side_effect = RuntimeError
629
630 self.assertRaises(RuntimeError, mock.method)
631
632
633 def test_customize_wrapped_object_with_side_effect_function(self):
634 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100635 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000636 def side_effect():
637 return sentinel.VALUE
638
639 real = Real()
640 mock = Mock(wraps=real)
641 mock.method.side_effect = side_effect
642
643 self.assertEqual(mock.method(), sentinel.VALUE)
644
645
646 def test_customize_wrapped_object_with_return_value(self):
647 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100648 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000649
650 real = Real()
651 mock = Mock(wraps=real)
652 mock.method.return_value = sentinel.VALUE
653
654 self.assertEqual(mock.method(), sentinel.VALUE)
655
656
657 def test_customize_wrapped_object_with_return_value_and_side_effect(self):
658 # side_effect should always take precedence over return_value.
659 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100660 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000661
662 real = Real()
663 mock = Mock(wraps=real)
664 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
665 mock.method.return_value = sentinel.WRONG_VALUE
666
667 self.assertEqual(mock.method(), sentinel.VALUE1)
668 self.assertEqual(mock.method(), sentinel.VALUE2)
669 self.assertRaises(StopIteration, mock.method)
670
671
672 def test_customize_wrapped_object_with_return_value_and_side_effect2(self):
673 # side_effect can return DEFAULT to default to return_value
674 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100675 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000676
677 real = Real()
678 mock = Mock(wraps=real)
679 mock.method.side_effect = lambda: DEFAULT
680 mock.method.return_value = sentinel.VALUE
681
682 self.assertEqual(mock.method(), sentinel.VALUE)
683
684
685 def test_customize_wrapped_object_with_return_value_and_side_effect_default(self):
686 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100687 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000688
689 real = Real()
690 mock = Mock(wraps=real)
691 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
692 mock.method.return_value = sentinel.RETURN
693
694 self.assertEqual(mock.method(), sentinel.VALUE1)
695 self.assertEqual(mock.method(), sentinel.RETURN)
696 self.assertRaises(StopIteration, mock.method)
697
698
Michael Foord345266a2012-03-14 12:24:34 -0700699 def test_exceptional_side_effect(self):
700 mock = Mock(side_effect=AttributeError)
701 self.assertRaises(AttributeError, mock)
702
703 mock = Mock(side_effect=AttributeError('foo'))
704 self.assertRaises(AttributeError, mock)
705
706
707 def test_baseexceptional_side_effect(self):
708 mock = Mock(side_effect=KeyboardInterrupt)
709 self.assertRaises(KeyboardInterrupt, mock)
710
711 mock = Mock(side_effect=KeyboardInterrupt('foo'))
712 self.assertRaises(KeyboardInterrupt, mock)
713
714
715 def test_assert_called_with_message(self):
716 mock = Mock()
Susan Su2bdd5852019-02-13 18:22:29 -0800717 self.assertRaisesRegex(AssertionError, 'not called',
Michael Foord345266a2012-03-14 12:24:34 -0700718 mock.assert_called_with)
719
720
Michael Foord28d591c2012-09-28 16:15:22 +0100721 def test_assert_called_once_with_message(self):
722 mock = Mock(name='geoffrey')
723 self.assertRaisesRegex(AssertionError,
724 r"Expected 'geoffrey' to be called once\.",
725 mock.assert_called_once_with)
726
727
Michael Foord345266a2012-03-14 12:24:34 -0700728 def test__name__(self):
729 mock = Mock()
730 self.assertRaises(AttributeError, lambda: mock.__name__)
731
732 mock.__name__ = 'foo'
733 self.assertEqual(mock.__name__, 'foo')
734
735
736 def test_spec_list_subclass(self):
737 class Sub(list):
738 pass
739 mock = Mock(spec=Sub(['foo']))
740
741 mock.append(3)
742 mock.append.assert_called_with(3)
743 self.assertRaises(AttributeError, getattr, mock, 'foo')
744
745
746 def test_spec_class(self):
747 class X(object):
748 pass
749
750 mock = Mock(spec=X)
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200751 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700752
753 mock = Mock(spec=X())
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200754 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700755
756 self.assertIs(mock.__class__, X)
757 self.assertEqual(Mock().__class__.__name__, 'Mock')
758
759 mock = Mock(spec_set=X)
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200760 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700761
762 mock = Mock(spec_set=X())
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200763 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700764
765
Chris Withersadbf1782019-05-01 23:04:04 +0100766 def test_spec_class_no_object_base(self):
767 class X:
768 pass
769
770 mock = Mock(spec=X)
771 self.assertIsInstance(mock, X)
772
773 mock = Mock(spec=X())
774 self.assertIsInstance(mock, X)
775
776 self.assertIs(mock.__class__, X)
777 self.assertEqual(Mock().__class__.__name__, 'Mock')
778
779 mock = Mock(spec_set=X)
780 self.assertIsInstance(mock, X)
781
782 mock = Mock(spec_set=X())
783 self.assertIsInstance(mock, X)
784
785
Michael Foord345266a2012-03-14 12:24:34 -0700786 def test_setting_attribute_with_spec_set(self):
787 class X(object):
788 y = 3
789
790 mock = Mock(spec=X)
791 mock.x = 'foo'
792
793 mock = Mock(spec_set=X)
794 def set_attr():
795 mock.x = 'foo'
796
797 mock.y = 'foo'
798 self.assertRaises(AttributeError, set_attr)
799
800
801 def test_copy(self):
802 current = sys.getrecursionlimit()
803 self.addCleanup(sys.setrecursionlimit, current)
804
805 # can't use sys.maxint as this doesn't exist in Python 3
806 sys.setrecursionlimit(int(10e8))
807 # this segfaults without the fix in place
808 copy.copy(Mock())
809
810
811 def test_subclass_with_properties(self):
812 class SubClass(Mock):
813 def _get(self):
814 return 3
815 def _set(self, value):
816 raise NameError('strange error')
817 some_attribute = property(_get, _set)
818
819 s = SubClass(spec_set=SubClass)
820 self.assertEqual(s.some_attribute, 3)
821
822 def test():
823 s.some_attribute = 3
824 self.assertRaises(NameError, test)
825
826 def test():
827 s.foo = 'bar'
828 self.assertRaises(AttributeError, test)
829
830
831 def test_setting_call(self):
832 mock = Mock()
833 def __call__(self, a):
834 return self._mock_call(a)
835
836 type(mock).__call__ = __call__
837 mock('one')
838 mock.assert_called_with('one')
839
840 self.assertRaises(TypeError, mock, 'one', 'two')
841
842
843 def test_dir(self):
844 mock = Mock()
845 attrs = set(dir(mock))
846 type_attrs = set([m for m in dir(Mock) if not m.startswith('_')])
847
848 # all public attributes from the type are included
849 self.assertEqual(set(), type_attrs - attrs)
850
851 # creates these attributes
852 mock.a, mock.b
853 self.assertIn('a', dir(mock))
854 self.assertIn('b', dir(mock))
855
856 # instance attributes
857 mock.c = mock.d = None
858 self.assertIn('c', dir(mock))
859 self.assertIn('d', dir(mock))
860
861 # magic methods
862 mock.__iter__ = lambda s: iter([])
863 self.assertIn('__iter__', dir(mock))
864
865
866 def test_dir_from_spec(self):
867 mock = Mock(spec=unittest.TestCase)
868 testcase_attrs = set(dir(unittest.TestCase))
869 attrs = set(dir(mock))
870
871 # all attributes from the spec are included
872 self.assertEqual(set(), testcase_attrs - attrs)
873
874 # shadow a sys attribute
875 mock.version = 3
876 self.assertEqual(dir(mock).count('version'), 1)
877
878
879 def test_filter_dir(self):
880 patcher = patch.object(mock, 'FILTER_DIR', False)
881 patcher.start()
882 try:
883 attrs = set(dir(Mock()))
884 type_attrs = set(dir(Mock))
885
886 # ALL attributes from the type are included
887 self.assertEqual(set(), type_attrs - attrs)
888 finally:
889 patcher.stop()
890
891
Mario Corchero0df635c2019-04-30 19:56:36 +0100892 def test_dir_does_not_include_deleted_attributes(self):
893 mock = Mock()
894 mock.child.return_value = 1
895
896 self.assertIn('child', dir(mock))
897 del mock.child
898 self.assertNotIn('child', dir(mock))
899
900
Michael Foord345266a2012-03-14 12:24:34 -0700901 def test_configure_mock(self):
902 mock = Mock(foo='bar')
903 self.assertEqual(mock.foo, 'bar')
904
905 mock = MagicMock(foo='bar')
906 self.assertEqual(mock.foo, 'bar')
907
908 kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
909 'foo': MagicMock()}
910 mock = Mock(**kwargs)
911 self.assertRaises(KeyError, mock)
912 self.assertEqual(mock.foo.bar(), 33)
913 self.assertIsInstance(mock.foo, MagicMock)
914
915 mock = Mock()
916 mock.configure_mock(**kwargs)
917 self.assertRaises(KeyError, mock)
918 self.assertEqual(mock.foo.bar(), 33)
919 self.assertIsInstance(mock.foo, MagicMock)
920
921
922 def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs):
923 # needed because assertRaisesRegex doesn't work easily with newlines
Chris Withersadbf1782019-05-01 23:04:04 +0100924 with self.assertRaises(exception) as context:
Michael Foord345266a2012-03-14 12:24:34 -0700925 func(*args, **kwargs)
Chris Withersadbf1782019-05-01 23:04:04 +0100926 msg = str(context.exception)
Michael Foord345266a2012-03-14 12:24:34 -0700927 self.assertEqual(msg, message)
928
929
930 def test_assert_called_with_failure_message(self):
931 mock = NonCallableMock()
932
Susan Su2bdd5852019-02-13 18:22:29 -0800933 actual = 'not called.'
Michael Foord345266a2012-03-14 12:24:34 -0700934 expected = "mock(1, '2', 3, bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -0800935 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700936 self.assertRaisesWithMsg(
Susan Su2bdd5852019-02-13 18:22:29 -0800937 AssertionError, message % (expected, actual),
Michael Foord345266a2012-03-14 12:24:34 -0700938 mock.assert_called_with, 1, '2', 3, bar='foo'
939 )
940
941 mock.foo(1, '2', 3, foo='foo')
942
943
944 asserters = [
945 mock.foo.assert_called_with, mock.foo.assert_called_once_with
946 ]
947 for meth in asserters:
948 actual = "foo(1, '2', 3, foo='foo')"
949 expected = "foo(1, '2', 3, bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -0800950 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700951 self.assertRaisesWithMsg(
952 AssertionError, message % (expected, actual),
953 meth, 1, '2', 3, bar='foo'
954 )
955
956 # just kwargs
957 for meth in asserters:
958 actual = "foo(1, '2', 3, foo='foo')"
959 expected = "foo(bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -0800960 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700961 self.assertRaisesWithMsg(
962 AssertionError, message % (expected, actual),
963 meth, bar='foo'
964 )
965
966 # just args
967 for meth in asserters:
968 actual = "foo(1, '2', 3, foo='foo')"
969 expected = "foo(1, 2, 3)"
Susan Su2bdd5852019-02-13 18:22:29 -0800970 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700971 self.assertRaisesWithMsg(
972 AssertionError, message % (expected, actual),
973 meth, 1, 2, 3
974 )
975
976 # empty
977 for meth in asserters:
978 actual = "foo(1, '2', 3, foo='foo')"
979 expected = "foo()"
Susan Su2bdd5852019-02-13 18:22:29 -0800980 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700981 self.assertRaisesWithMsg(
982 AssertionError, message % (expected, actual), meth
983 )
984
985
986 def test_mock_calls(self):
987 mock = MagicMock()
988
989 # need to do this because MagicMock.mock_calls used to just return
990 # a MagicMock which also returned a MagicMock when __eq__ was called
991 self.assertIs(mock.mock_calls == [], True)
992
993 mock = MagicMock()
994 mock()
995 expected = [('', (), {})]
996 self.assertEqual(mock.mock_calls, expected)
997
998 mock.foo()
999 expected.append(call.foo())
1000 self.assertEqual(mock.mock_calls, expected)
1001 # intermediate mock_calls work too
1002 self.assertEqual(mock.foo.mock_calls, [('', (), {})])
1003
1004 mock = MagicMock()
1005 mock().foo(1, 2, 3, a=4, b=5)
1006 expected = [
1007 ('', (), {}), ('().foo', (1, 2, 3), dict(a=4, b=5))
1008 ]
1009 self.assertEqual(mock.mock_calls, expected)
1010 self.assertEqual(mock.return_value.foo.mock_calls,
1011 [('', (1, 2, 3), dict(a=4, b=5))])
1012 self.assertEqual(mock.return_value.mock_calls,
1013 [('foo', (1, 2, 3), dict(a=4, b=5))])
1014
1015 mock = MagicMock()
1016 mock().foo.bar().baz()
1017 expected = [
1018 ('', (), {}), ('().foo.bar', (), {}),
1019 ('().foo.bar().baz', (), {})
1020 ]
1021 self.assertEqual(mock.mock_calls, expected)
1022 self.assertEqual(mock().mock_calls,
1023 call.foo.bar().baz().call_list())
1024
1025 for kwargs in dict(), dict(name='bar'):
1026 mock = MagicMock(**kwargs)
1027 int(mock.foo)
1028 expected = [('foo.__int__', (), {})]
1029 self.assertEqual(mock.mock_calls, expected)
1030
1031 mock = MagicMock(**kwargs)
1032 mock.a()()
1033 expected = [('a', (), {}), ('a()', (), {})]
1034 self.assertEqual(mock.mock_calls, expected)
1035 self.assertEqual(mock.a().mock_calls, [call()])
1036
1037 mock = MagicMock(**kwargs)
1038 mock(1)(2)(3)
1039 self.assertEqual(mock.mock_calls, call(1)(2)(3).call_list())
1040 self.assertEqual(mock().mock_calls, call(2)(3).call_list())
1041 self.assertEqual(mock()().mock_calls, call(3).call_list())
1042
1043 mock = MagicMock(**kwargs)
1044 mock(1)(2)(3).a.b.c(4)
1045 self.assertEqual(mock.mock_calls,
1046 call(1)(2)(3).a.b.c(4).call_list())
1047 self.assertEqual(mock().mock_calls,
1048 call(2)(3).a.b.c(4).call_list())
1049 self.assertEqual(mock()().mock_calls,
1050 call(3).a.b.c(4).call_list())
1051
1052 mock = MagicMock(**kwargs)
1053 int(mock().foo.bar().baz())
1054 last_call = ('().foo.bar().baz().__int__', (), {})
1055 self.assertEqual(mock.mock_calls[-1], last_call)
1056 self.assertEqual(mock().mock_calls,
1057 call.foo.bar().baz().__int__().call_list())
1058 self.assertEqual(mock().foo.bar().mock_calls,
1059 call.baz().__int__().call_list())
1060 self.assertEqual(mock().foo.bar().baz.mock_calls,
1061 call().__int__().call_list())
1062
1063
Chris Withers8ca0fa92018-12-03 21:31:37 +00001064 def test_child_mock_call_equal(self):
1065 m = Mock()
1066 result = m()
1067 result.wibble()
1068 # parent looks like this:
1069 self.assertEqual(m.mock_calls, [call(), call().wibble()])
1070 # but child should look like this:
1071 self.assertEqual(result.mock_calls, [call.wibble()])
1072
1073
1074 def test_mock_call_not_equal_leaf(self):
1075 m = Mock()
1076 m.foo().something()
1077 self.assertNotEqual(m.mock_calls[1], call.foo().different())
1078 self.assertEqual(m.mock_calls[0], call.foo())
1079
1080
1081 def test_mock_call_not_equal_non_leaf(self):
1082 m = Mock()
1083 m.foo().bar()
1084 self.assertNotEqual(m.mock_calls[1], call.baz().bar())
1085 self.assertNotEqual(m.mock_calls[0], call.baz())
1086
1087
1088 def test_mock_call_not_equal_non_leaf_params_different(self):
1089 m = Mock()
1090 m.foo(x=1).bar()
1091 # This isn't ideal, but there's no way to fix it without breaking backwards compatibility:
1092 self.assertEqual(m.mock_calls[1], call.foo(x=2).bar())
1093
1094
1095 def test_mock_call_not_equal_non_leaf_attr(self):
1096 m = Mock()
1097 m.foo.bar()
1098 self.assertNotEqual(m.mock_calls[0], call.baz.bar())
1099
1100
1101 def test_mock_call_not_equal_non_leaf_call_versus_attr(self):
1102 m = Mock()
1103 m.foo.bar()
1104 self.assertNotEqual(m.mock_calls[0], call.foo().bar())
1105
1106
1107 def test_mock_call_repr(self):
1108 m = Mock()
1109 m.foo().bar().baz.bob()
1110 self.assertEqual(repr(m.mock_calls[0]), 'call.foo()')
1111 self.assertEqual(repr(m.mock_calls[1]), 'call.foo().bar()')
1112 self.assertEqual(repr(m.mock_calls[2]), 'call.foo().bar().baz.bob()')
1113
1114
Chris Withersadbf1782019-05-01 23:04:04 +01001115 def test_mock_call_repr_loop(self):
1116 m = Mock()
1117 m.foo = m
1118 repr(m.foo())
1119 self.assertRegex(repr(m.foo()), r"<Mock name='mock\(\)' id='\d+'>")
1120
1121
1122 def test_mock_calls_contains(self):
1123 m = Mock()
1124 self.assertFalse([call()] in m.mock_calls)
1125
1126
Michael Foord345266a2012-03-14 12:24:34 -07001127 def test_subclassing(self):
1128 class Subclass(Mock):
1129 pass
1130
1131 mock = Subclass()
1132 self.assertIsInstance(mock.foo, Subclass)
1133 self.assertIsInstance(mock(), Subclass)
1134
1135 class Subclass(Mock):
1136 def _get_child_mock(self, **kwargs):
1137 return Mock(**kwargs)
1138
1139 mock = Subclass()
1140 self.assertNotIsInstance(mock.foo, Subclass)
1141 self.assertNotIsInstance(mock(), Subclass)
1142
1143
1144 def test_arg_lists(self):
1145 mocks = [
1146 Mock(),
1147 MagicMock(),
1148 NonCallableMock(),
1149 NonCallableMagicMock()
1150 ]
1151
1152 def assert_attrs(mock):
1153 names = 'call_args_list', 'method_calls', 'mock_calls'
1154 for name in names:
1155 attr = getattr(mock, name)
1156 self.assertIsInstance(attr, _CallList)
1157 self.assertIsInstance(attr, list)
1158 self.assertEqual(attr, [])
1159
1160 for mock in mocks:
1161 assert_attrs(mock)
1162
1163 if callable(mock):
1164 mock()
1165 mock(1, 2)
1166 mock(a=3)
1167
1168 mock.reset_mock()
1169 assert_attrs(mock)
1170
1171 mock.foo()
1172 mock.foo.bar(1, a=3)
1173 mock.foo(1).bar().baz(3)
1174
1175 mock.reset_mock()
1176 assert_attrs(mock)
1177
1178
1179 def test_call_args_two_tuple(self):
1180 mock = Mock()
1181 mock(1, a=3)
1182 mock(2, b=4)
1183
1184 self.assertEqual(len(mock.call_args), 2)
Kumar Akshayb0df45e2019-03-22 13:40:40 +05301185 self.assertEqual(mock.call_args.args, (2,))
1186 self.assertEqual(mock.call_args.kwargs, dict(b=4))
Michael Foord345266a2012-03-14 12:24:34 -07001187
1188 expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))]
1189 for expected, call_args in zip(expected_list, mock.call_args_list):
1190 self.assertEqual(len(call_args), 2)
1191 self.assertEqual(expected[0], call_args[0])
1192 self.assertEqual(expected[1], call_args[1])
1193
1194
1195 def test_side_effect_iterator(self):
1196 mock = Mock(side_effect=iter([1, 2, 3]))
1197 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1198 self.assertRaises(StopIteration, mock)
1199
1200 mock = MagicMock(side_effect=['a', 'b', 'c'])
1201 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1202 self.assertRaises(StopIteration, mock)
1203
1204 mock = Mock(side_effect='ghi')
1205 self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i'])
1206 self.assertRaises(StopIteration, mock)
1207
1208 class Foo(object):
1209 pass
1210 mock = MagicMock(side_effect=Foo)
1211 self.assertIsInstance(mock(), Foo)
1212
1213 mock = Mock(side_effect=Iter())
1214 self.assertEqual([mock(), mock(), mock(), mock()],
1215 ['this', 'is', 'an', 'iter'])
1216 self.assertRaises(StopIteration, mock)
1217
1218
Michael Foord2cd48732012-04-21 15:52:11 +01001219 def test_side_effect_iterator_exceptions(self):
1220 for Klass in Mock, MagicMock:
1221 iterable = (ValueError, 3, KeyError, 6)
1222 m = Klass(side_effect=iterable)
1223 self.assertRaises(ValueError, m)
1224 self.assertEqual(m(), 3)
1225 self.assertRaises(KeyError, m)
1226 self.assertEqual(m(), 6)
1227
1228
Michael Foord345266a2012-03-14 12:24:34 -07001229 def test_side_effect_setting_iterator(self):
1230 mock = Mock()
1231 mock.side_effect = iter([1, 2, 3])
1232 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1233 self.assertRaises(StopIteration, mock)
1234 side_effect = mock.side_effect
1235 self.assertIsInstance(side_effect, type(iter([])))
1236
1237 mock.side_effect = ['a', 'b', 'c']
1238 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1239 self.assertRaises(StopIteration, mock)
1240 side_effect = mock.side_effect
1241 self.assertIsInstance(side_effect, type(iter([])))
1242
1243 this_iter = Iter()
1244 mock.side_effect = this_iter
1245 self.assertEqual([mock(), mock(), mock(), mock()],
1246 ['this', 'is', 'an', 'iter'])
1247 self.assertRaises(StopIteration, mock)
1248 self.assertIs(mock.side_effect, this_iter)
1249
Andrew Svetlov8b2cd752013-04-07 16:42:24 +03001250 def test_side_effect_iterator_default(self):
1251 mock = Mock(return_value=2)
1252 mock.side_effect = iter([1, DEFAULT])
1253 self.assertEqual([mock(), mock()], [1, 2])
Michael Foord345266a2012-03-14 12:24:34 -07001254
1255 def test_assert_has_calls_any_order(self):
1256 mock = Mock()
1257 mock(1, 2)
1258 mock(a=3)
1259 mock(3, 4)
1260 mock(b=6)
1261 mock(b=6)
1262
1263 kalls = [
1264 call(1, 2), ({'a': 3},),
1265 ((3, 4),), ((), {'a': 3}),
1266 ('', (1, 2)), ('', {'a': 3}),
1267 ('', (1, 2), {}), ('', (), {'a': 3})
1268 ]
1269 for kall in kalls:
1270 mock.assert_has_calls([kall], any_order=True)
1271
1272 for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
1273 self.assertRaises(
1274 AssertionError, mock.assert_has_calls,
1275 [kall], any_order=True
1276 )
1277
1278 kall_lists = [
1279 [call(1, 2), call(b=6)],
1280 [call(3, 4), call(1, 2)],
1281 [call(b=6), call(b=6)],
1282 ]
1283
1284 for kall_list in kall_lists:
1285 mock.assert_has_calls(kall_list, any_order=True)
1286
1287 kall_lists = [
1288 [call(b=6), call(b=6), call(b=6)],
1289 [call(1, 2), call(1, 2)],
1290 [call(3, 4), call(1, 2), call(5, 7)],
1291 [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
1292 ]
1293 for kall_list in kall_lists:
1294 self.assertRaises(
1295 AssertionError, mock.assert_has_calls,
1296 kall_list, any_order=True
1297 )
1298
1299 def test_assert_has_calls(self):
1300 kalls1 = [
1301 call(1, 2), ({'a': 3},),
1302 ((3, 4),), call(b=6),
1303 ('', (1,), {'b': 6}),
1304 ]
1305 kalls2 = [call.foo(), call.bar(1)]
1306 kalls2.extend(call.spam().baz(a=3).call_list())
1307 kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
1308
1309 mocks = []
1310 for mock in Mock(), MagicMock():
1311 mock(1, 2)
1312 mock(a=3)
1313 mock(3, 4)
1314 mock(b=6)
1315 mock(1, b=6)
1316 mocks.append((mock, kalls1))
1317
1318 mock = Mock()
1319 mock.foo()
1320 mock.bar(1)
1321 mock.spam().baz(a=3)
1322 mock.bam(set(), foo={}).fish([1])
1323 mocks.append((mock, kalls2))
1324
1325 for mock, kalls in mocks:
1326 for i in range(len(kalls)):
1327 for step in 1, 2, 3:
1328 these = kalls[i:i+step]
1329 mock.assert_has_calls(these)
1330
1331 if len(these) > 1:
1332 self.assertRaises(
1333 AssertionError,
1334 mock.assert_has_calls,
1335 list(reversed(these))
1336 )
1337
1338
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001339 def test_assert_has_calls_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001340 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001341
1342 mock = Mock(spec=f)
1343
1344 mock(1, b=2, c=3)
1345 mock(4, 5, c=6, d=7)
1346 mock(10, 11, c=12)
1347 calls = [
1348 ('', (1, 2, 3), {}),
1349 ('', (4, 5, 6), {'d': 7}),
1350 ((10, 11, 12), {}),
1351 ]
1352 mock.assert_has_calls(calls)
1353 mock.assert_has_calls(calls, any_order=True)
1354 mock.assert_has_calls(calls[1:])
1355 mock.assert_has_calls(calls[1:], any_order=True)
1356 mock.assert_has_calls(calls[:-1])
1357 mock.assert_has_calls(calls[:-1], any_order=True)
1358 # Reversed order
1359 calls = list(reversed(calls))
1360 with self.assertRaises(AssertionError):
1361 mock.assert_has_calls(calls)
1362 mock.assert_has_calls(calls, any_order=True)
1363 with self.assertRaises(AssertionError):
1364 mock.assert_has_calls(calls[1:])
1365 mock.assert_has_calls(calls[1:], any_order=True)
1366 with self.assertRaises(AssertionError):
1367 mock.assert_has_calls(calls[:-1])
1368 mock.assert_has_calls(calls[:-1], any_order=True)
1369
1370
Michael Foord345266a2012-03-14 12:24:34 -07001371 def test_assert_any_call(self):
1372 mock = Mock()
1373 mock(1, 2)
1374 mock(a=3)
1375 mock(1, b=6)
1376
1377 mock.assert_any_call(1, 2)
1378 mock.assert_any_call(a=3)
1379 mock.assert_any_call(1, b=6)
1380
1381 self.assertRaises(
1382 AssertionError,
1383 mock.assert_any_call
1384 )
1385 self.assertRaises(
1386 AssertionError,
1387 mock.assert_any_call,
1388 1, 3
1389 )
1390 self.assertRaises(
1391 AssertionError,
1392 mock.assert_any_call,
1393 a=4
1394 )
1395
1396
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001397 def test_assert_any_call_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001398 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001399
1400 mock = Mock(spec=f)
1401
1402 mock(1, b=2, c=3)
1403 mock(4, 5, c=6, d=7)
1404 mock.assert_any_call(1, 2, 3)
1405 mock.assert_any_call(a=1, b=2, c=3)
1406 mock.assert_any_call(4, 5, 6, 7)
1407 mock.assert_any_call(a=4, b=5, c=6, d=7)
1408 self.assertRaises(AssertionError, mock.assert_any_call,
1409 1, b=3, c=2)
1410 # Expected call doesn't match the spec's signature
1411 with self.assertRaises(AssertionError) as cm:
1412 mock.assert_any_call(e=8)
1413 self.assertIsInstance(cm.exception.__cause__, TypeError)
1414
1415
Michael Foord345266a2012-03-14 12:24:34 -07001416 def test_mock_calls_create_autospec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001417 def f(a, b): pass
Michael Foord345266a2012-03-14 12:24:34 -07001418 obj = Iter()
1419 obj.f = f
1420
1421 funcs = [
1422 create_autospec(f),
1423 create_autospec(obj).f
1424 ]
1425 for func in funcs:
1426 func(1, 2)
1427 func(3, 4)
1428
1429 self.assertEqual(
1430 func.mock_calls, [call(1, 2), call(3, 4)]
1431 )
1432
Kushal Das484f8a82014-04-16 01:05:50 +05301433 #Issue21222
1434 def test_create_autospec_with_name(self):
1435 m = mock.create_autospec(object(), name='sweet_func')
1436 self.assertIn('sweet_func', repr(m))
Michael Foord345266a2012-03-14 12:24:34 -07001437
Xtreak9b218562019-04-22 08:00:23 +05301438 #Issue23078
1439 def test_create_autospec_classmethod_and_staticmethod(self):
1440 class TestClass:
1441 @classmethod
Chris Withersadbf1782019-05-01 23:04:04 +01001442 def class_method(cls): pass
Xtreak9b218562019-04-22 08:00:23 +05301443
1444 @staticmethod
Chris Withersadbf1782019-05-01 23:04:04 +01001445 def static_method(): pass
Xtreak9b218562019-04-22 08:00:23 +05301446 for method in ('class_method', 'static_method'):
1447 with self.subTest(method=method):
1448 mock_method = mock.create_autospec(getattr(TestClass, method))
1449 mock_method()
1450 mock_method.assert_called_once_with()
1451 self.assertRaises(TypeError, mock_method, 'extra_arg')
1452
Kushal Das8c145342014-04-16 23:32:21 +05301453 #Issue21238
1454 def test_mock_unsafe(self):
1455 m = Mock()
Zackery Spytzb9b08cd2019-05-08 11:32:24 -06001456 msg = "Attributes cannot start with 'assert' or 'assret'"
1457 with self.assertRaisesRegex(AttributeError, msg):
Kushal Das8c145342014-04-16 23:32:21 +05301458 m.assert_foo_call()
Zackery Spytzb9b08cd2019-05-08 11:32:24 -06001459 with self.assertRaisesRegex(AttributeError, msg):
Kushal Das8c145342014-04-16 23:32:21 +05301460 m.assret_foo_call()
1461 m = Mock(unsafe=True)
1462 m.assert_foo_call()
1463 m.assret_foo_call()
1464
Kushal Das8af9db32014-04-17 01:36:14 +05301465 #Issue21262
1466 def test_assert_not_called(self):
1467 m = Mock()
1468 m.hello.assert_not_called()
1469 m.hello()
1470 with self.assertRaises(AssertionError):
1471 m.hello.assert_not_called()
1472
Petter Strandmark47d94242018-10-28 21:37:10 +01001473 def test_assert_not_called_message(self):
1474 m = Mock()
1475 m(1, 2)
1476 self.assertRaisesRegex(AssertionError,
1477 re.escape("Calls: [call(1, 2)]"),
1478 m.assert_not_called)
1479
Victor Stinner2c2a4e62016-03-11 22:17:48 +01001480 def test_assert_called(self):
1481 m = Mock()
1482 with self.assertRaises(AssertionError):
1483 m.hello.assert_called()
1484 m.hello()
1485 m.hello.assert_called()
1486
1487 m.hello()
1488 m.hello.assert_called()
1489
1490 def test_assert_called_once(self):
1491 m = Mock()
1492 with self.assertRaises(AssertionError):
1493 m.hello.assert_called_once()
1494 m.hello()
1495 m.hello.assert_called_once()
1496
1497 m.hello()
1498 with self.assertRaises(AssertionError):
1499 m.hello.assert_called_once()
1500
Petter Strandmark47d94242018-10-28 21:37:10 +01001501 def test_assert_called_once_message(self):
1502 m = Mock()
1503 m(1, 2)
1504 m(3)
1505 self.assertRaisesRegex(AssertionError,
1506 re.escape("Calls: [call(1, 2), call(3)]"),
1507 m.assert_called_once)
1508
1509 def test_assert_called_once_message_not_called(self):
1510 m = Mock()
1511 with self.assertRaises(AssertionError) as e:
1512 m.assert_called_once()
1513 self.assertNotIn("Calls:", str(e.exception))
1514
Kushal Das047f14c2014-06-09 13:45:56 +05301515 #Issue21256 printout of keyword args should be in deterministic order
1516 def test_sorted_call_signature(self):
1517 m = Mock()
1518 m.hello(name='hello', daddy='hero')
1519 text = "call(daddy='hero', name='hello')"
R David Murray130a5662014-06-11 17:09:43 -04001520 self.assertEqual(repr(m.hello.call_args), text)
Kushal Das8af9db32014-04-17 01:36:14 +05301521
Kushal Dasa37b9582014-09-16 18:33:37 +05301522 #Issue21270 overrides tuple methods for mock.call objects
1523 def test_override_tuple_methods(self):
1524 c = call.count()
1525 i = call.index(132,'hello')
1526 m = Mock()
1527 m.count()
1528 m.index(132,"hello")
1529 self.assertEqual(m.method_calls[0], c)
1530 self.assertEqual(m.method_calls[1], i)
1531
Kushal Das9cd39a12016-06-02 10:20:16 -07001532 def test_reset_return_sideeffect(self):
1533 m = Mock(return_value=10, side_effect=[2,3])
1534 m.reset_mock(return_value=True, side_effect=True)
1535 self.assertIsInstance(m.return_value, Mock)
1536 self.assertEqual(m.side_effect, None)
1537
1538 def test_reset_return(self):
1539 m = Mock(return_value=10, side_effect=[2,3])
1540 m.reset_mock(return_value=True)
1541 self.assertIsInstance(m.return_value, Mock)
1542 self.assertNotEqual(m.side_effect, None)
1543
1544 def test_reset_sideeffect(self):
1545 m = Mock(return_value=10, side_effect=[2,3])
1546 m.reset_mock(side_effect=True)
1547 self.assertEqual(m.return_value, 10)
1548 self.assertEqual(m.side_effect, None)
1549
Michael Foord345266a2012-03-14 12:24:34 -07001550 def test_mock_add_spec(self):
1551 class _One(object):
1552 one = 1
1553 class _Two(object):
1554 two = 2
1555 class Anything(object):
1556 one = two = three = 'four'
1557
1558 klasses = [
1559 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
1560 ]
1561 for Klass in list(klasses):
1562 klasses.append(lambda K=Klass: K(spec=Anything))
1563 klasses.append(lambda K=Klass: K(spec_set=Anything))
1564
1565 for Klass in klasses:
1566 for kwargs in dict(), dict(spec_set=True):
1567 mock = Klass()
1568 #no error
1569 mock.one, mock.two, mock.three
1570
1571 for One, Two in [(_One, _Two), (['one'], ['two'])]:
1572 for kwargs in dict(), dict(spec_set=True):
1573 mock.mock_add_spec(One, **kwargs)
1574
1575 mock.one
1576 self.assertRaises(
1577 AttributeError, getattr, mock, 'two'
1578 )
1579 self.assertRaises(
1580 AttributeError, getattr, mock, 'three'
1581 )
1582 if 'spec_set' in kwargs:
1583 self.assertRaises(
1584 AttributeError, setattr, mock, 'three', None
1585 )
1586
1587 mock.mock_add_spec(Two, **kwargs)
1588 self.assertRaises(
1589 AttributeError, getattr, mock, 'one'
1590 )
1591 mock.two
1592 self.assertRaises(
1593 AttributeError, getattr, mock, 'three'
1594 )
1595 if 'spec_set' in kwargs:
1596 self.assertRaises(
1597 AttributeError, setattr, mock, 'three', None
1598 )
1599 # note that creating a mock, setting an instance attribute, and
1600 # *then* setting a spec doesn't work. Not the intended use case
1601
1602
1603 def test_mock_add_spec_magic_methods(self):
1604 for Klass in MagicMock, NonCallableMagicMock:
1605 mock = Klass()
1606 int(mock)
1607
1608 mock.mock_add_spec(object)
1609 self.assertRaises(TypeError, int, mock)
1610
1611 mock = Klass()
1612 mock['foo']
1613 mock.__int__.return_value =4
1614
1615 mock.mock_add_spec(int)
1616 self.assertEqual(int(mock), 4)
1617 self.assertRaises(TypeError, lambda: mock['foo'])
1618
1619
1620 def test_adding_child_mock(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07001621 for Klass in (NonCallableMock, Mock, MagicMock, NonCallableMagicMock,
1622 AsyncMock):
Michael Foord345266a2012-03-14 12:24:34 -07001623 mock = Klass()
1624
1625 mock.foo = Mock()
1626 mock.foo()
1627
1628 self.assertEqual(mock.method_calls, [call.foo()])
1629 self.assertEqual(mock.mock_calls, [call.foo()])
1630
1631 mock = Klass()
1632 mock.bar = Mock(name='name')
1633 mock.bar()
1634 self.assertEqual(mock.method_calls, [])
1635 self.assertEqual(mock.mock_calls, [])
1636
1637 # mock with an existing _new_parent but no name
1638 mock = Klass()
1639 mock.baz = MagicMock()()
1640 mock.baz()
1641 self.assertEqual(mock.method_calls, [])
1642 self.assertEqual(mock.mock_calls, [])
1643
1644
1645 def test_adding_return_value_mock(self):
1646 for Klass in Mock, MagicMock:
1647 mock = Klass()
1648 mock.return_value = MagicMock()
1649
1650 mock()()
1651 self.assertEqual(mock.mock_calls, [call(), call()()])
1652
1653
1654 def test_manager_mock(self):
1655 class Foo(object):
1656 one = 'one'
1657 two = 'two'
1658 manager = Mock()
1659 p1 = patch.object(Foo, 'one')
1660 p2 = patch.object(Foo, 'two')
1661
1662 mock_one = p1.start()
1663 self.addCleanup(p1.stop)
1664 mock_two = p2.start()
1665 self.addCleanup(p2.stop)
1666
1667 manager.attach_mock(mock_one, 'one')
1668 manager.attach_mock(mock_two, 'two')
1669
1670 Foo.two()
1671 Foo.one()
1672
1673 self.assertEqual(manager.mock_calls, [call.two(), call.one()])
1674
1675
1676 def test_magic_methods_mock_calls(self):
1677 for Klass in Mock, MagicMock:
1678 m = Klass()
1679 m.__int__ = Mock(return_value=3)
1680 m.__float__ = MagicMock(return_value=3.0)
1681 int(m)
1682 float(m)
1683
1684 self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
1685 self.assertEqual(m.method_calls, [])
1686
Robert Collins5329aaa2015-07-17 20:08:45 +12001687 def test_mock_open_reuse_issue_21750(self):
1688 mocked_open = mock.mock_open(read_data='data')
1689 f1 = mocked_open('a-name')
Robert Collinsca647ef2015-07-24 03:48:20 +12001690 f1_data = f1.read()
Robert Collins5329aaa2015-07-17 20:08:45 +12001691 f2 = mocked_open('another-name')
Robert Collinsca647ef2015-07-24 03:48:20 +12001692 f2_data = f2.read()
1693 self.assertEqual(f1_data, f2_data)
1694
Tony Flury20870232018-09-12 23:21:16 +01001695 def test_mock_open_dunder_iter_issue(self):
1696 # Test dunder_iter method generates the expected result and
1697 # consumes the iterator.
1698 mocked_open = mock.mock_open(read_data='Remarkable\nNorwegian Blue')
1699 f1 = mocked_open('a-name')
1700 lines = [line for line in f1]
1701 self.assertEqual(lines[0], 'Remarkable\n')
1702 self.assertEqual(lines[1], 'Norwegian Blue')
1703 self.assertEqual(list(f1), [])
1704
Robert Collinsca647ef2015-07-24 03:48:20 +12001705 def test_mock_open_write(self):
1706 # Test exception in file writing write()
1707 mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV'))
1708 with mock.patch('tempfile.NamedTemporaryFile', mock_namedtemp):
1709 mock_filehandle = mock_namedtemp.return_value
1710 mock_write = mock_filehandle.write
1711 mock_write.side_effect = OSError('Test 2 Error')
1712 def attempt():
1713 tempfile.NamedTemporaryFile().write('asd')
1714 self.assertRaises(OSError, attempt)
1715
1716 def test_mock_open_alter_readline(self):
1717 mopen = mock.mock_open(read_data='foo\nbarn')
1718 mopen.return_value.readline.side_effect = lambda *args:'abc'
1719 first = mopen().readline()
1720 second = mopen().readline()
1721 self.assertEqual('abc', first)
1722 self.assertEqual('abc', second)
Michael Foord345266a2012-03-14 12:24:34 -07001723
Robert Collins9549a3e2016-05-16 15:22:01 +12001724 def test_mock_open_after_eof(self):
1725 # read, readline and readlines should work after end of file.
1726 _open = mock.mock_open(read_data='foo')
1727 h = _open('bar')
1728 h.read()
1729 self.assertEqual('', h.read())
1730 self.assertEqual('', h.read())
1731 self.assertEqual('', h.readline())
1732 self.assertEqual('', h.readline())
1733 self.assertEqual([], h.readlines())
1734 self.assertEqual([], h.readlines())
1735
Michael Foord345266a2012-03-14 12:24:34 -07001736 def test_mock_parents(self):
1737 for Klass in Mock, MagicMock:
1738 m = Klass()
1739 original_repr = repr(m)
1740 m.return_value = m
1741 self.assertIs(m(), m)
1742 self.assertEqual(repr(m), original_repr)
1743
1744 m.reset_mock()
1745 self.assertIs(m(), m)
1746 self.assertEqual(repr(m), original_repr)
1747
1748 m = Klass()
1749 m.b = m.a
1750 self.assertIn("name='mock.a'", repr(m.b))
1751 self.assertIn("name='mock.a'", repr(m.a))
1752 m.reset_mock()
1753 self.assertIn("name='mock.a'", repr(m.b))
1754 self.assertIn("name='mock.a'", repr(m.a))
1755
1756 m = Klass()
1757 original_repr = repr(m)
1758 m.a = m()
1759 m.a.return_value = m
1760
1761 self.assertEqual(repr(m), original_repr)
1762 self.assertEqual(repr(m.a()), original_repr)
1763
1764
1765 def test_attach_mock(self):
1766 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
1767 for Klass in classes:
1768 for Klass2 in classes:
1769 m = Klass()
1770
1771 m2 = Klass2(name='foo')
1772 m.attach_mock(m2, 'bar')
1773
1774 self.assertIs(m.bar, m2)
1775 self.assertIn("name='mock.bar'", repr(m2))
1776
1777 m.bar.baz(1)
1778 self.assertEqual(m.mock_calls, [call.bar.baz(1)])
1779 self.assertEqual(m.method_calls, [call.bar.baz(1)])
1780
1781
1782 def test_attach_mock_return_value(self):
1783 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
1784 for Klass in Mock, MagicMock:
1785 for Klass2 in classes:
1786 m = Klass()
1787
1788 m2 = Klass2(name='foo')
1789 m.attach_mock(m2, 'return_value')
1790
1791 self.assertIs(m(), m2)
1792 self.assertIn("name='mock()'", repr(m2))
1793
1794 m2.foo()
1795 self.assertEqual(m.mock_calls, call().foo().call_list())
1796
1797
1798 def test_attribute_deletion(self):
Michael Foord468ec342013-09-15 20:05:19 +12001799 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
1800 NonCallableMock()):
Michael Foord345266a2012-03-14 12:24:34 -07001801 self.assertTrue(hasattr(mock, 'm'))
1802
1803 del mock.m
1804 self.assertFalse(hasattr(mock, 'm'))
1805
1806 del mock.f
1807 self.assertFalse(hasattr(mock, 'f'))
1808 self.assertRaises(AttributeError, getattr, mock, 'f')
1809
1810
Pablo Galindo222d3032019-01-21 08:57:46 +00001811 def test_mock_does_not_raise_on_repeated_attribute_deletion(self):
1812 # bpo-20239: Assigning and deleting twice an attribute raises.
1813 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
1814 NonCallableMock()):
1815 mock.foo = 3
1816 self.assertTrue(hasattr(mock, 'foo'))
1817 self.assertEqual(mock.foo, 3)
1818
1819 del mock.foo
1820 self.assertFalse(hasattr(mock, 'foo'))
1821
1822 mock.foo = 4
1823 self.assertTrue(hasattr(mock, 'foo'))
1824 self.assertEqual(mock.foo, 4)
1825
1826 del mock.foo
1827 self.assertFalse(hasattr(mock, 'foo'))
1828
1829
1830 def test_mock_raises_when_deleting_nonexistent_attribute(self):
1831 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
1832 NonCallableMock()):
1833 del mock.foo
1834 with self.assertRaises(AttributeError):
1835 del mock.foo
1836
1837
Xtreakedeca922018-12-01 15:33:54 +05301838 def test_reset_mock_does_not_raise_on_attr_deletion(self):
1839 # bpo-31177: reset_mock should not raise AttributeError when attributes
1840 # were deleted in a mock instance
1841 mock = Mock()
1842 mock.child = True
1843 del mock.child
1844 mock.reset_mock()
1845 self.assertFalse(hasattr(mock, 'child'))
1846
1847
Michael Foord345266a2012-03-14 12:24:34 -07001848 def test_class_assignable(self):
1849 for mock in Mock(), MagicMock():
1850 self.assertNotIsInstance(mock, int)
1851
1852 mock.__class__ = int
1853 self.assertIsInstance(mock, int)
1854 mock.foo
1855
Andrew Dunaie63e6172018-12-04 11:08:45 +02001856 def test_name_attribute_of_call(self):
1857 # bpo-35357: _Call should not disclose any attributes whose names
1858 # may clash with popular ones (such as ".name")
1859 self.assertIsNotNone(call.name)
1860 self.assertEqual(type(call.name), _Call)
1861 self.assertEqual(type(call.name().name), _Call)
1862
1863 def test_parent_attribute_of_call(self):
1864 # bpo-35357: _Call should not disclose any attributes whose names
1865 # may clash with popular ones (such as ".parent")
1866 self.assertIsNotNone(call.parent)
1867 self.assertEqual(type(call.parent), _Call)
1868 self.assertEqual(type(call.parent().parent), _Call)
1869
Michael Foord345266a2012-03-14 12:24:34 -07001870
Xtreak9c3f2842019-02-26 03:16:34 +05301871 def test_parent_propagation_with_create_autospec(self):
1872
Chris Withersadbf1782019-05-01 23:04:04 +01001873 def foo(a, b): pass
Xtreak9c3f2842019-02-26 03:16:34 +05301874
1875 mock = Mock()
1876 mock.child = create_autospec(foo)
1877 mock.child(1, 2)
1878
1879 self.assertRaises(TypeError, mock.child, 1)
1880 self.assertEqual(mock.mock_calls, [call.child(1, 2)])
1881
Xtreak830b43d2019-04-14 00:42:33 +05301882 def test_isinstance_under_settrace(self):
1883 # bpo-36593 : __class__ is not set for a class that has __class__
1884 # property defined when it's used with sys.settrace(trace) set.
1885 # Delete the module to force reimport with tracing function set
1886 # restore the old reference later since there are other tests that are
1887 # dependent on unittest.mock.patch. In testpatch.PatchTest
1888 # test_patch_dict_test_prefix and test_patch_test_prefix not restoring
1889 # causes the objects patched to go out of sync
1890
1891 old_patch = unittest.mock.patch
1892
1893 # Directly using __setattr__ on unittest.mock causes current imported
1894 # reference to be updated. Use a lambda so that during cleanup the
1895 # re-imported new reference is updated.
1896 self.addCleanup(lambda patch: setattr(unittest.mock, 'patch', patch),
1897 old_patch)
1898
1899 with patch.dict('sys.modules'):
1900 del sys.modules['unittest.mock']
1901
Chris Withersadbf1782019-05-01 23:04:04 +01001902 # This trace will stop coverage being measured ;-)
1903 def trace(frame, event, arg): # pragma: no cover
Xtreak830b43d2019-04-14 00:42:33 +05301904 return trace
1905
Chris Withersadbf1782019-05-01 23:04:04 +01001906 self.addCleanup(sys.settrace, sys.gettrace())
Xtreak830b43d2019-04-14 00:42:33 +05301907 sys.settrace(trace)
Xtreak830b43d2019-04-14 00:42:33 +05301908
1909 from unittest.mock import (
1910 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
1911 )
1912
1913 mocks = [
1914 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
1915 ]
1916
1917 for mock in mocks:
1918 obj = mock(spec=Something)
1919 self.assertIsInstance(obj, Something)
1920
Xtreak9c3f2842019-02-26 03:16:34 +05301921
Michael Foord345266a2012-03-14 12:24:34 -07001922if __name__ == '__main__':
1923 unittest.main()