python (3.12.0)
1 import copy
2 import re
3 import sys
4 import tempfile
5
6 from test.support import ALWAYS_EQ
7 import unittest
8 from test.test_unittest.testmock.support import is_instance
9 from unittest import mock
10 from unittest.mock import (
11 call, DEFAULT, patch, sentinel,
12 MagicMock, Mock, NonCallableMock,
13 NonCallableMagicMock, AsyncMock, _Call, _CallList,
14 create_autospec, InvalidSpecError
15 )
16
17
18 class ESC[4;38;5;81mIter(ESC[4;38;5;149mobject):
19 def __init__(self):
20 self.thing = iter(['this', 'is', 'an', 'iter'])
21
22 def __iter__(self):
23 return self
24
25 def next(self):
26 return next(self.thing)
27
28 __next__ = next
29
30
31 class ESC[4;38;5;81mSomething(ESC[4;38;5;149mobject):
32 def meth(self, a, b, c, d=None): pass
33
34 @classmethod
35 def cmeth(cls, a, b, c, d=None): pass
36
37 @staticmethod
38 def smeth(a, b, c, d=None): pass
39
40
41 class ESC[4;38;5;81mTypos():
42 autospect = None
43 auto_spec = None
44 set_spec = None
45
46
47 def something(a): pass
48
49
50 class ESC[4;38;5;81mMockTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
51
52 def test_all(self):
53 # if __all__ is badly defined then import * will raise an error
54 # We have to exec it because you can't import * inside a method
55 # in Python 3
56 exec("from unittest.mock import *")
57
58
59 def test_constructor(self):
60 mock = Mock()
61
62 self.assertFalse(mock.called, "called not initialised correctly")
63 self.assertEqual(mock.call_count, 0,
64 "call_count not initialised correctly")
65 self.assertTrue(is_instance(mock.return_value, Mock),
66 "return_value not initialised correctly")
67
68 self.assertEqual(mock.call_args, None,
69 "call_args not initialised correctly")
70 self.assertEqual(mock.call_args_list, [],
71 "call_args_list not initialised correctly")
72 self.assertEqual(mock.method_calls, [],
73 "method_calls not initialised correctly")
74
75 # Can't use hasattr for this test as it always returns True on a mock
76 self.assertNotIn('_items', mock.__dict__,
77 "default mock should not have '_items' attribute")
78
79 self.assertIsNone(mock._mock_parent,
80 "parent not initialised correctly")
81 self.assertIsNone(mock._mock_methods,
82 "methods not initialised correctly")
83 self.assertEqual(mock._mock_children, {},
84 "children not initialised incorrectly")
85
86
87 def test_return_value_in_constructor(self):
88 mock = Mock(return_value=None)
89 self.assertIsNone(mock.return_value,
90 "return value in constructor not honoured")
91
92
93 def test_change_return_value_via_delegate(self):
94 def f(): pass
95 mock = create_autospec(f)
96 mock.mock.return_value = 1
97 self.assertEqual(mock(), 1)
98
99
100 def test_change_side_effect_via_delegate(self):
101 def f(): pass
102 mock = create_autospec(f)
103 mock.mock.side_effect = TypeError()
104 with self.assertRaises(TypeError):
105 mock()
106
107
108 def test_repr(self):
109 mock = Mock(name='foo')
110 self.assertIn('foo', repr(mock))
111 self.assertIn("'%s'" % id(mock), repr(mock))
112
113 mocks = [(Mock(), 'mock'), (Mock(name='bar'), 'bar')]
114 for mock, name in mocks:
115 self.assertIn('%s.bar' % name, repr(mock.bar))
116 self.assertIn('%s.foo()' % name, repr(mock.foo()))
117 self.assertIn('%s.foo().bing' % name, repr(mock.foo().bing))
118 self.assertIn('%s()' % name, repr(mock()))
119 self.assertIn('%s()()' % name, repr(mock()()))
120 self.assertIn('%s()().foo.bar.baz().bing' % name,
121 repr(mock()().foo.bar.baz().bing))
122
123
124 def test_repr_with_spec(self):
125 class ESC[4;38;5;81mX(ESC[4;38;5;149mobject):
126 pass
127
128 mock = Mock(spec=X)
129 self.assertIn(" spec='X' ", repr(mock))
130
131 mock = Mock(spec=X())
132 self.assertIn(" spec='X' ", repr(mock))
133
134 mock = Mock(spec_set=X)
135 self.assertIn(" spec_set='X' ", repr(mock))
136
137 mock = Mock(spec_set=X())
138 self.assertIn(" spec_set='X' ", repr(mock))
139
140 mock = Mock(spec=X, name='foo')
141 self.assertIn(" spec='X' ", repr(mock))
142 self.assertIn(" name='foo' ", repr(mock))
143
144 mock = Mock(name='foo')
145 self.assertNotIn("spec", repr(mock))
146
147 mock = Mock()
148 self.assertNotIn("spec", repr(mock))
149
150 mock = Mock(spec=['foo'])
151 self.assertNotIn("spec", repr(mock))
152
153
154 def test_side_effect(self):
155 mock = Mock()
156
157 def effect(*args, **kwargs):
158 raise SystemError('kablooie')
159
160 mock.side_effect = effect
161 self.assertRaises(SystemError, mock, 1, 2, fish=3)
162 mock.assert_called_with(1, 2, fish=3)
163
164 results = [1, 2, 3]
165 def effect():
166 return results.pop()
167 mock.side_effect = effect
168
169 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
170 "side effect not used correctly")
171
172 mock = Mock(side_effect=sentinel.SideEffect)
173 self.assertEqual(mock.side_effect, sentinel.SideEffect,
174 "side effect in constructor not used")
175
176 def side_effect():
177 return DEFAULT
178 mock = Mock(side_effect=side_effect, return_value=sentinel.RETURN)
179 self.assertEqual(mock(), sentinel.RETURN)
180
181 def test_autospec_side_effect(self):
182 # Test for issue17826
183 results = [1, 2, 3]
184 def effect():
185 return results.pop()
186 def f(): pass
187
188 mock = create_autospec(f)
189 mock.side_effect = [1, 2, 3]
190 self.assertEqual([mock(), mock(), mock()], [1, 2, 3],
191 "side effect not used correctly in create_autospec")
192 # Test where side effect is a callable
193 results = [1, 2, 3]
194 mock = create_autospec(f)
195 mock.side_effect = effect
196 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
197 "callable side effect not used correctly")
198
199 def test_autospec_side_effect_exception(self):
200 # Test for issue 23661
201 def f(): pass
202
203 mock = create_autospec(f)
204 mock.side_effect = ValueError('Bazinga!')
205 self.assertRaisesRegex(ValueError, 'Bazinga!', mock)
206
207
208 def test_autospec_mock(self):
209 class ESC[4;38;5;81mA(ESC[4;38;5;149mobject):
210 class ESC[4;38;5;81mB(ESC[4;38;5;149mobject):
211 C = None
212
213 with mock.patch.object(A, 'B'):
214 with self.assertRaisesRegex(InvalidSpecError,
215 "Cannot autospec attr 'B' from target <MagicMock spec='A'"):
216 create_autospec(A).B
217 with self.assertRaisesRegex(InvalidSpecError,
218 "Cannot autospec attr 'B' from target 'A'"):
219 mock.patch.object(A, 'B', autospec=True).start()
220 with self.assertRaisesRegex(InvalidSpecError,
221 "Cannot autospec attr 'C' as the patch target "):
222 mock.patch.object(A.B, 'C', autospec=True).start()
223 with self.assertRaisesRegex(InvalidSpecError,
224 "Cannot spec attr 'B' as the spec "):
225 mock.patch.object(A, 'B', spec=A.B).start()
226 with self.assertRaisesRegex(InvalidSpecError,
227 "Cannot spec attr 'B' as the spec_set "):
228 mock.patch.object(A, 'B', spec_set=A.B).start()
229 with self.assertRaisesRegex(InvalidSpecError,
230 "Cannot spec attr 'B' as the spec_set "):
231 mock.patch.object(A, 'B', spec_set=A.B).start()
232 with self.assertRaisesRegex(InvalidSpecError, "Cannot spec a Mock object."):
233 mock.Mock(A.B)
234 with mock.patch('builtins.open', mock.mock_open()):
235 mock.mock_open() # should still be valid with open() mocked
236
237
238 def test_reset_mock(self):
239 parent = Mock()
240 spec = ["something"]
241 mock = Mock(name="child", parent=parent, spec=spec)
242 mock(sentinel.Something, something=sentinel.SomethingElse)
243 something = mock.something
244 mock.something()
245 mock.side_effect = sentinel.SideEffect
246 return_value = mock.return_value
247 return_value()
248
249 mock.reset_mock()
250
251 self.assertEqual(mock._mock_name, "child",
252 "name incorrectly reset")
253 self.assertEqual(mock._mock_parent, parent,
254 "parent incorrectly reset")
255 self.assertEqual(mock._mock_methods, spec,
256 "methods incorrectly reset")
257
258 self.assertFalse(mock.called, "called not reset")
259 self.assertEqual(mock.call_count, 0, "call_count not reset")
260 self.assertEqual(mock.call_args, None, "call_args not reset")
261 self.assertEqual(mock.call_args_list, [], "call_args_list not reset")
262 self.assertEqual(mock.method_calls, [],
263 "method_calls not initialised correctly: %r != %r" %
264 (mock.method_calls, []))
265 self.assertEqual(mock.mock_calls, [])
266
267 self.assertEqual(mock.side_effect, sentinel.SideEffect,
268 "side_effect incorrectly reset")
269 self.assertEqual(mock.return_value, return_value,
270 "return_value incorrectly reset")
271 self.assertFalse(return_value.called, "return value mock not reset")
272 self.assertEqual(mock._mock_children, {'something': something},
273 "children reset incorrectly")
274 self.assertEqual(mock.something, something,
275 "children incorrectly cleared")
276 self.assertFalse(mock.something.called, "child not reset")
277
278
279 def test_reset_mock_recursion(self):
280 mock = Mock()
281 mock.return_value = mock
282
283 # used to cause recursion
284 mock.reset_mock()
285
286 def test_reset_mock_on_mock_open_issue_18622(self):
287 a = mock.mock_open()
288 a.reset_mock()
289
290 def test_call(self):
291 mock = Mock()
292 self.assertTrue(is_instance(mock.return_value, Mock),
293 "Default return_value should be a Mock")
294
295 result = mock()
296 self.assertEqual(mock(), result,
297 "different result from consecutive calls")
298 mock.reset_mock()
299
300 ret_val = mock(sentinel.Arg)
301 self.assertTrue(mock.called, "called not set")
302 self.assertEqual(mock.call_count, 1, "call_count incorrect")
303 self.assertEqual(mock.call_args, ((sentinel.Arg,), {}),
304 "call_args not set")
305 self.assertEqual(mock.call_args.args, (sentinel.Arg,),
306 "call_args not set")
307 self.assertEqual(mock.call_args.kwargs, {},
308 "call_args not set")
309 self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})],
310 "call_args_list not initialised correctly")
311
312 mock.return_value = sentinel.ReturnValue
313 ret_val = mock(sentinel.Arg, key=sentinel.KeyArg)
314 self.assertEqual(ret_val, sentinel.ReturnValue,
315 "incorrect return value")
316
317 self.assertEqual(mock.call_count, 2, "call_count incorrect")
318 self.assertEqual(mock.call_args,
319 ((sentinel.Arg,), {'key': sentinel.KeyArg}),
320 "call_args not set")
321 self.assertEqual(mock.call_args_list, [
322 ((sentinel.Arg,), {}),
323 ((sentinel.Arg,), {'key': sentinel.KeyArg})
324 ],
325 "call_args_list not set")
326
327
328 def test_call_args_comparison(self):
329 mock = Mock()
330 mock()
331 mock(sentinel.Arg)
332 mock(kw=sentinel.Kwarg)
333 mock(sentinel.Arg, kw=sentinel.Kwarg)
334 self.assertEqual(mock.call_args_list, [
335 (),
336 ((sentinel.Arg,),),
337 ({"kw": sentinel.Kwarg},),
338 ((sentinel.Arg,), {"kw": sentinel.Kwarg})
339 ])
340 self.assertEqual(mock.call_args,
341 ((sentinel.Arg,), {"kw": sentinel.Kwarg}))
342 self.assertEqual(mock.call_args.args, (sentinel.Arg,))
343 self.assertEqual(mock.call_args.kwargs, {"kw": sentinel.Kwarg})
344
345 # Comparing call_args to a long sequence should not raise
346 # an exception. See issue 24857.
347 self.assertFalse(mock.call_args == "a long sequence")
348
349
350 def test_calls_equal_with_any(self):
351 # Check that equality and non-equality is consistent even when
352 # comparing with mock.ANY
353 mm = mock.MagicMock()
354 self.assertTrue(mm == mm)
355 self.assertFalse(mm != mm)
356 self.assertFalse(mm == mock.MagicMock())
357 self.assertTrue(mm != mock.MagicMock())
358 self.assertTrue(mm == mock.ANY)
359 self.assertFalse(mm != mock.ANY)
360 self.assertTrue(mock.ANY == mm)
361 self.assertFalse(mock.ANY != mm)
362 self.assertTrue(mm == ALWAYS_EQ)
363 self.assertFalse(mm != ALWAYS_EQ)
364
365 call1 = mock.call(mock.MagicMock())
366 call2 = mock.call(mock.ANY)
367 self.assertTrue(call1 == call2)
368 self.assertFalse(call1 != call2)
369 self.assertTrue(call2 == call1)
370 self.assertFalse(call2 != call1)
371
372 self.assertTrue(call1 == ALWAYS_EQ)
373 self.assertFalse(call1 != ALWAYS_EQ)
374 self.assertFalse(call1 == 1)
375 self.assertTrue(call1 != 1)
376
377
378 def test_assert_called_with(self):
379 mock = Mock()
380 mock()
381
382 # Will raise an exception if it fails
383 mock.assert_called_with()
384 self.assertRaises(AssertionError, mock.assert_called_with, 1)
385
386 mock.reset_mock()
387 self.assertRaises(AssertionError, mock.assert_called_with)
388
389 mock(1, 2, 3, a='fish', b='nothing')
390 mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
391
392
393 def test_assert_called_with_any(self):
394 m = MagicMock()
395 m(MagicMock())
396 m.assert_called_with(mock.ANY)
397
398
399 def test_assert_called_with_function_spec(self):
400 def f(a, b, c, d=None): pass
401
402 mock = Mock(spec=f)
403
404 mock(1, b=2, c=3)
405 mock.assert_called_with(1, 2, 3)
406 mock.assert_called_with(a=1, b=2, c=3)
407 self.assertRaises(AssertionError, mock.assert_called_with,
408 1, b=3, c=2)
409 # Expected call doesn't match the spec's signature
410 with self.assertRaises(AssertionError) as cm:
411 mock.assert_called_with(e=8)
412 self.assertIsInstance(cm.exception.__cause__, TypeError)
413
414
415 def test_assert_called_with_method_spec(self):
416 def _check(mock):
417 mock(1, b=2, c=3)
418 mock.assert_called_with(1, 2, 3)
419 mock.assert_called_with(a=1, b=2, c=3)
420 self.assertRaises(AssertionError, mock.assert_called_with,
421 1, b=3, c=2)
422
423 mock = Mock(spec=Something().meth)
424 _check(mock)
425 mock = Mock(spec=Something.cmeth)
426 _check(mock)
427 mock = Mock(spec=Something().cmeth)
428 _check(mock)
429 mock = Mock(spec=Something.smeth)
430 _check(mock)
431 mock = Mock(spec=Something().smeth)
432 _check(mock)
433
434
435 def test_assert_called_exception_message(self):
436 msg = "Expected '{0}' to have been called"
437 with self.assertRaisesRegex(AssertionError, msg.format('mock')):
438 Mock().assert_called()
439 with self.assertRaisesRegex(AssertionError, msg.format('test_name')):
440 Mock(name="test_name").assert_called()
441
442
443 def test_assert_called_once_with(self):
444 mock = Mock()
445 mock()
446
447 # Will raise an exception if it fails
448 mock.assert_called_once_with()
449
450 mock()
451 self.assertRaises(AssertionError, mock.assert_called_once_with)
452
453 mock.reset_mock()
454 self.assertRaises(AssertionError, mock.assert_called_once_with)
455
456 mock('foo', 'bar', baz=2)
457 mock.assert_called_once_with('foo', 'bar', baz=2)
458
459 mock.reset_mock()
460 mock('foo', 'bar', baz=2)
461 self.assertRaises(
462 AssertionError,
463 lambda: mock.assert_called_once_with('bob', 'bar', baz=2)
464 )
465
466 def test_assert_called_once_with_call_list(self):
467 m = Mock()
468 m(1)
469 m(2)
470 self.assertRaisesRegex(AssertionError,
471 re.escape("Calls: [call(1), call(2)]"),
472 lambda: m.assert_called_once_with(2))
473
474
475 def test_assert_called_once_with_function_spec(self):
476 def f(a, b, c, d=None): pass
477
478 mock = Mock(spec=f)
479
480 mock(1, b=2, c=3)
481 mock.assert_called_once_with(1, 2, 3)
482 mock.assert_called_once_with(a=1, b=2, c=3)
483 self.assertRaises(AssertionError, mock.assert_called_once_with,
484 1, b=3, c=2)
485 # Expected call doesn't match the spec's signature
486 with self.assertRaises(AssertionError) as cm:
487 mock.assert_called_once_with(e=8)
488 self.assertIsInstance(cm.exception.__cause__, TypeError)
489 # Mock called more than once => always fails
490 mock(4, 5, 6)
491 self.assertRaises(AssertionError, mock.assert_called_once_with,
492 1, 2, 3)
493 self.assertRaises(AssertionError, mock.assert_called_once_with,
494 4, 5, 6)
495
496
497 def test_attribute_access_returns_mocks(self):
498 mock = Mock()
499 something = mock.something
500 self.assertTrue(is_instance(something, Mock), "attribute isn't a mock")
501 self.assertEqual(mock.something, something,
502 "different attributes returned for same name")
503
504 # Usage example
505 mock = Mock()
506 mock.something.return_value = 3
507
508 self.assertEqual(mock.something(), 3, "method returned wrong value")
509 self.assertTrue(mock.something.called,
510 "method didn't record being called")
511
512
513 def test_attributes_have_name_and_parent_set(self):
514 mock = Mock()
515 something = mock.something
516
517 self.assertEqual(something._mock_name, "something",
518 "attribute name not set correctly")
519 self.assertEqual(something._mock_parent, mock,
520 "attribute parent not set correctly")
521
522
523 def test_method_calls_recorded(self):
524 mock = Mock()
525 mock.something(3, fish=None)
526 mock.something_else.something(6, cake=sentinel.Cake)
527
528 self.assertEqual(mock.something_else.method_calls,
529 [("something", (6,), {'cake': sentinel.Cake})],
530 "method calls not recorded correctly")
531 self.assertEqual(mock.method_calls, [
532 ("something", (3,), {'fish': None}),
533 ("something_else.something", (6,), {'cake': sentinel.Cake})
534 ],
535 "method calls not recorded correctly")
536
537
538 def test_method_calls_compare_easily(self):
539 mock = Mock()
540 mock.something()
541 self.assertEqual(mock.method_calls, [('something',)])
542 self.assertEqual(mock.method_calls, [('something', (), {})])
543
544 mock = Mock()
545 mock.something('different')
546 self.assertEqual(mock.method_calls, [('something', ('different',))])
547 self.assertEqual(mock.method_calls,
548 [('something', ('different',), {})])
549
550 mock = Mock()
551 mock.something(x=1)
552 self.assertEqual(mock.method_calls, [('something', {'x': 1})])
553 self.assertEqual(mock.method_calls, [('something', (), {'x': 1})])
554
555 mock = Mock()
556 mock.something('different', some='more')
557 self.assertEqual(mock.method_calls, [
558 ('something', ('different',), {'some': 'more'})
559 ])
560
561
562 def test_only_allowed_methods_exist(self):
563 for spec in ['something'], ('something',):
564 for arg in 'spec', 'spec_set':
565 mock = Mock(**{arg: spec})
566
567 # this should be allowed
568 mock.something
569 self.assertRaisesRegex(
570 AttributeError,
571 "Mock object has no attribute 'something_else'",
572 getattr, mock, 'something_else'
573 )
574
575
576 def test_from_spec(self):
577 class ESC[4;38;5;81mSomething(ESC[4;38;5;149mobject):
578 x = 3
579 __something__ = None
580 def y(self): pass
581
582 def test_attributes(mock):
583 # should work
584 mock.x
585 mock.y
586 mock.__something__
587 self.assertRaisesRegex(
588 AttributeError,
589 "Mock object has no attribute 'z'",
590 getattr, mock, 'z'
591 )
592 self.assertRaisesRegex(
593 AttributeError,
594 "Mock object has no attribute '__foobar__'",
595 getattr, mock, '__foobar__'
596 )
597
598 test_attributes(Mock(spec=Something))
599 test_attributes(Mock(spec=Something()))
600
601
602 def test_wraps_calls(self):
603 real = Mock()
604
605 mock = Mock(wraps=real)
606 self.assertEqual(mock(), real())
607
608 real.reset_mock()
609
610 mock(1, 2, fish=3)
611 real.assert_called_with(1, 2, fish=3)
612
613
614 def test_wraps_prevents_automatic_creation_of_mocks(self):
615 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
616 pass
617
618 real = Real()
619 mock = Mock(wraps=real)
620
621 self.assertRaises(AttributeError, lambda: mock.new_attr())
622
623
624 def test_wraps_call_with_nondefault_return_value(self):
625 real = Mock()
626
627 mock = Mock(wraps=real)
628 mock.return_value = 3
629
630 self.assertEqual(mock(), 3)
631 self.assertFalse(real.called)
632
633
634 def test_wraps_attributes(self):
635 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
636 attribute = Mock()
637
638 real = Real()
639
640 mock = Mock(wraps=real)
641 self.assertEqual(mock.attribute(), real.attribute())
642 self.assertRaises(AttributeError, lambda: mock.fish)
643
644 self.assertNotEqual(mock.attribute, real.attribute)
645 result = mock.attribute.frog(1, 2, fish=3)
646 Real.attribute.frog.assert_called_with(1, 2, fish=3)
647 self.assertEqual(result, Real.attribute.frog())
648
649
650 def test_customize_wrapped_object_with_side_effect_iterable_with_default(self):
651 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
652 def method(self):
653 return sentinel.ORIGINAL_VALUE
654
655 real = Real()
656 mock = Mock(wraps=real)
657 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
658
659 self.assertEqual(mock.method(), sentinel.VALUE1)
660 self.assertEqual(mock.method(), sentinel.ORIGINAL_VALUE)
661 self.assertRaises(StopIteration, mock.method)
662
663
664 def test_customize_wrapped_object_with_side_effect_iterable(self):
665 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
666 def method(self): pass
667
668 real = Real()
669 mock = Mock(wraps=real)
670 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
671
672 self.assertEqual(mock.method(), sentinel.VALUE1)
673 self.assertEqual(mock.method(), sentinel.VALUE2)
674 self.assertRaises(StopIteration, mock.method)
675
676
677 def test_customize_wrapped_object_with_side_effect_exception(self):
678 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
679 def method(self): pass
680
681 real = Real()
682 mock = Mock(wraps=real)
683 mock.method.side_effect = RuntimeError
684
685 self.assertRaises(RuntimeError, mock.method)
686
687
688 def test_customize_wrapped_object_with_side_effect_function(self):
689 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
690 def method(self): pass
691 def side_effect():
692 return sentinel.VALUE
693
694 real = Real()
695 mock = Mock(wraps=real)
696 mock.method.side_effect = side_effect
697
698 self.assertEqual(mock.method(), sentinel.VALUE)
699
700
701 def test_customize_wrapped_object_with_return_value(self):
702 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
703 def method(self): pass
704
705 real = Real()
706 mock = Mock(wraps=real)
707 mock.method.return_value = sentinel.VALUE
708
709 self.assertEqual(mock.method(), sentinel.VALUE)
710
711
712 def test_customize_wrapped_object_with_return_value_and_side_effect(self):
713 # side_effect should always take precedence over return_value.
714 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
715 def method(self): pass
716
717 real = Real()
718 mock = Mock(wraps=real)
719 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
720 mock.method.return_value = sentinel.WRONG_VALUE
721
722 self.assertEqual(mock.method(), sentinel.VALUE1)
723 self.assertEqual(mock.method(), sentinel.VALUE2)
724 self.assertRaises(StopIteration, mock.method)
725
726
727 def test_customize_wrapped_object_with_return_value_and_side_effect2(self):
728 # side_effect can return DEFAULT to default to return_value
729 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
730 def method(self): pass
731
732 real = Real()
733 mock = Mock(wraps=real)
734 mock.method.side_effect = lambda: DEFAULT
735 mock.method.return_value = sentinel.VALUE
736
737 self.assertEqual(mock.method(), sentinel.VALUE)
738
739
740 def test_customize_wrapped_object_with_return_value_and_side_effect_default(self):
741 class ESC[4;38;5;81mReal(ESC[4;38;5;149mobject):
742 def method(self): pass
743
744 real = Real()
745 mock = Mock(wraps=real)
746 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
747 mock.method.return_value = sentinel.RETURN
748
749 self.assertEqual(mock.method(), sentinel.VALUE1)
750 self.assertEqual(mock.method(), sentinel.RETURN)
751 self.assertRaises(StopIteration, mock.method)
752
753
754 def test_magic_method_wraps_dict(self):
755 # bpo-25597: MagicMock with wrap doesn't call wrapped object's
756 # method for magic methods with default values.
757 data = {'foo': 'bar'}
758
759 wrapped_dict = MagicMock(wraps=data)
760 self.assertEqual(wrapped_dict.get('foo'), 'bar')
761 # Accessing key gives a MagicMock
762 self.assertIsInstance(wrapped_dict['foo'], MagicMock)
763 # __contains__ method has a default value of False
764 self.assertFalse('foo' in wrapped_dict)
765
766 # return_value is non-sentinel and takes precedence over wrapped value.
767 wrapped_dict.get.return_value = 'return_value'
768 self.assertEqual(wrapped_dict.get('foo'), 'return_value')
769
770 # return_value is sentinel and hence wrapped value is returned.
771 wrapped_dict.get.return_value = sentinel.DEFAULT
772 self.assertEqual(wrapped_dict.get('foo'), 'bar')
773
774 self.assertEqual(wrapped_dict.get('baz'), None)
775 self.assertIsInstance(wrapped_dict['baz'], MagicMock)
776 self.assertFalse('bar' in wrapped_dict)
777
778 data['baz'] = 'spam'
779 self.assertEqual(wrapped_dict.get('baz'), 'spam')
780 self.assertIsInstance(wrapped_dict['baz'], MagicMock)
781 self.assertFalse('bar' in wrapped_dict)
782
783 del data['baz']
784 self.assertEqual(wrapped_dict.get('baz'), None)
785
786
787 def test_magic_method_wraps_class(self):
788
789 class ESC[4;38;5;81mFoo:
790
791 def __getitem__(self, index):
792 return index
793
794 def __custom_method__(self):
795 return "foo"
796
797
798 klass = MagicMock(wraps=Foo)
799 obj = klass()
800 self.assertEqual(obj.__getitem__(2), 2)
801 self.assertEqual(obj[2], 2)
802 self.assertEqual(obj.__custom_method__(), "foo")
803
804
805 def test_exceptional_side_effect(self):
806 mock = Mock(side_effect=AttributeError)
807 self.assertRaises(AttributeError, mock)
808
809 mock = Mock(side_effect=AttributeError('foo'))
810 self.assertRaises(AttributeError, mock)
811
812
813 def test_baseexceptional_side_effect(self):
814 mock = Mock(side_effect=KeyboardInterrupt)
815 self.assertRaises(KeyboardInterrupt, mock)
816
817 mock = Mock(side_effect=KeyboardInterrupt('foo'))
818 self.assertRaises(KeyboardInterrupt, mock)
819
820
821 def test_assert_called_with_message(self):
822 mock = Mock()
823 self.assertRaisesRegex(AssertionError, 'not called',
824 mock.assert_called_with)
825
826
827 def test_assert_called_once_with_message(self):
828 mock = Mock(name='geoffrey')
829 self.assertRaisesRegex(AssertionError,
830 r"Expected 'geoffrey' to be called once\.",
831 mock.assert_called_once_with)
832
833
834 def test__name__(self):
835 mock = Mock()
836 self.assertRaises(AttributeError, lambda: mock.__name__)
837
838 mock.__name__ = 'foo'
839 self.assertEqual(mock.__name__, 'foo')
840
841
842 def test_spec_list_subclass(self):
843 class ESC[4;38;5;81mSub(ESC[4;38;5;149mlist):
844 pass
845 mock = Mock(spec=Sub(['foo']))
846
847 mock.append(3)
848 mock.append.assert_called_with(3)
849 self.assertRaises(AttributeError, getattr, mock, 'foo')
850
851
852 def test_spec_class(self):
853 class ESC[4;38;5;81mX(ESC[4;38;5;149mobject):
854 pass
855
856 mock = Mock(spec=X)
857 self.assertIsInstance(mock, X)
858
859 mock = Mock(spec=X())
860 self.assertIsInstance(mock, X)
861
862 self.assertIs(mock.__class__, X)
863 self.assertEqual(Mock().__class__.__name__, 'Mock')
864
865 mock = Mock(spec_set=X)
866 self.assertIsInstance(mock, X)
867
868 mock = Mock(spec_set=X())
869 self.assertIsInstance(mock, X)
870
871
872 def test_spec_class_no_object_base(self):
873 class ESC[4;38;5;81mX:
874 pass
875
876 mock = Mock(spec=X)
877 self.assertIsInstance(mock, X)
878
879 mock = Mock(spec=X())
880 self.assertIsInstance(mock, X)
881
882 self.assertIs(mock.__class__, X)
883 self.assertEqual(Mock().__class__.__name__, 'Mock')
884
885 mock = Mock(spec_set=X)
886 self.assertIsInstance(mock, X)
887
888 mock = Mock(spec_set=X())
889 self.assertIsInstance(mock, X)
890
891
892 def test_setting_attribute_with_spec_set(self):
893 class ESC[4;38;5;81mX(ESC[4;38;5;149mobject):
894 y = 3
895
896 mock = Mock(spec=X)
897 mock.x = 'foo'
898
899 mock = Mock(spec_set=X)
900 def set_attr():
901 mock.x = 'foo'
902
903 mock.y = 'foo'
904 self.assertRaises(AttributeError, set_attr)
905
906
907 def test_copy(self):
908 current = sys.getrecursionlimit()
909 self.addCleanup(sys.setrecursionlimit, current)
910
911 # can't use sys.maxint as this doesn't exist in Python 3
912 sys.setrecursionlimit(int(10e8))
913 # this segfaults without the fix in place
914 copy.copy(Mock())
915
916
917 def test_subclass_with_properties(self):
918 class ESC[4;38;5;81mSubClass(ESC[4;38;5;149mMock):
919 def _get(self):
920 return 3
921 def _set(self, value):
922 raise NameError('strange error')
923 some_attribute = property(_get, _set)
924
925 s = SubClass(spec_set=SubClass)
926 self.assertEqual(s.some_attribute, 3)
927
928 def test():
929 s.some_attribute = 3
930 self.assertRaises(NameError, test)
931
932 def test():
933 s.foo = 'bar'
934 self.assertRaises(AttributeError, test)
935
936
937 def test_setting_call(self):
938 mock = Mock()
939 def __call__(self, a):
940 self._increment_mock_call(a)
941 return self._mock_call(a)
942
943 type(mock).__call__ = __call__
944 mock('one')
945 mock.assert_called_with('one')
946
947 self.assertRaises(TypeError, mock, 'one', 'two')
948
949
950 def test_dir(self):
951 mock = Mock()
952 attrs = set(dir(mock))
953 type_attrs = set([m for m in dir(Mock) if not m.startswith('_')])
954
955 # all public attributes from the type are included
956 self.assertEqual(set(), type_attrs - attrs)
957
958 # creates these attributes
959 mock.a, mock.b
960 self.assertIn('a', dir(mock))
961 self.assertIn('b', dir(mock))
962
963 # instance attributes
964 mock.c = mock.d = None
965 self.assertIn('c', dir(mock))
966 self.assertIn('d', dir(mock))
967
968 # magic methods
969 mock.__iter__ = lambda s: iter([])
970 self.assertIn('__iter__', dir(mock))
971
972
973 def test_dir_from_spec(self):
974 mock = Mock(spec=unittest.TestCase)
975 testcase_attrs = set(dir(unittest.TestCase))
976 attrs = set(dir(mock))
977
978 # all attributes from the spec are included
979 self.assertEqual(set(), testcase_attrs - attrs)
980
981 # shadow a sys attribute
982 mock.version = 3
983 self.assertEqual(dir(mock).count('version'), 1)
984
985
986 def test_filter_dir(self):
987 patcher = patch.object(mock, 'FILTER_DIR', False)
988 patcher.start()
989 try:
990 attrs = set(dir(Mock()))
991 type_attrs = set(dir(Mock))
992
993 # ALL attributes from the type are included
994 self.assertEqual(set(), type_attrs - attrs)
995 finally:
996 patcher.stop()
997
998
999 def test_dir_does_not_include_deleted_attributes(self):
1000 mock = Mock()
1001 mock.child.return_value = 1
1002
1003 self.assertIn('child', dir(mock))
1004 del mock.child
1005 self.assertNotIn('child', dir(mock))
1006
1007
1008 def test_configure_mock(self):
1009 mock = Mock(foo='bar')
1010 self.assertEqual(mock.foo, 'bar')
1011
1012 mock = MagicMock(foo='bar')
1013 self.assertEqual(mock.foo, 'bar')
1014
1015 kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
1016 'foo': MagicMock()}
1017 mock = Mock(**kwargs)
1018 self.assertRaises(KeyError, mock)
1019 self.assertEqual(mock.foo.bar(), 33)
1020 self.assertIsInstance(mock.foo, MagicMock)
1021
1022 mock = Mock()
1023 mock.configure_mock(**kwargs)
1024 self.assertRaises(KeyError, mock)
1025 self.assertEqual(mock.foo.bar(), 33)
1026 self.assertIsInstance(mock.foo, MagicMock)
1027
1028
1029 def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs):
1030 # needed because assertRaisesRegex doesn't work easily with newlines
1031 with self.assertRaises(exception) as context:
1032 func(*args, **kwargs)
1033 msg = str(context.exception)
1034 self.assertEqual(msg, message)
1035
1036
1037 def test_assert_called_with_failure_message(self):
1038 mock = NonCallableMock()
1039
1040 actual = 'not called.'
1041 expected = "mock(1, '2', 3, bar='foo')"
1042 message = 'expected call not found.\nExpected: %s\nActual: %s'
1043 self.assertRaisesWithMsg(
1044 AssertionError, message % (expected, actual),
1045 mock.assert_called_with, 1, '2', 3, bar='foo'
1046 )
1047
1048 mock.foo(1, '2', 3, foo='foo')
1049
1050
1051 asserters = [
1052 mock.foo.assert_called_with, mock.foo.assert_called_once_with
1053 ]
1054 for meth in asserters:
1055 actual = "foo(1, '2', 3, foo='foo')"
1056 expected = "foo(1, '2', 3, bar='foo')"
1057 message = 'expected call not found.\nExpected: %s\nActual: %s'
1058 self.assertRaisesWithMsg(
1059 AssertionError, message % (expected, actual),
1060 meth, 1, '2', 3, bar='foo'
1061 )
1062
1063 # just kwargs
1064 for meth in asserters:
1065 actual = "foo(1, '2', 3, foo='foo')"
1066 expected = "foo(bar='foo')"
1067 message = 'expected call not found.\nExpected: %s\nActual: %s'
1068 self.assertRaisesWithMsg(
1069 AssertionError, message % (expected, actual),
1070 meth, bar='foo'
1071 )
1072
1073 # just args
1074 for meth in asserters:
1075 actual = "foo(1, '2', 3, foo='foo')"
1076 expected = "foo(1, 2, 3)"
1077 message = 'expected call not found.\nExpected: %s\nActual: %s'
1078 self.assertRaisesWithMsg(
1079 AssertionError, message % (expected, actual),
1080 meth, 1, 2, 3
1081 )
1082
1083 # empty
1084 for meth in asserters:
1085 actual = "foo(1, '2', 3, foo='foo')"
1086 expected = "foo()"
1087 message = 'expected call not found.\nExpected: %s\nActual: %s'
1088 self.assertRaisesWithMsg(
1089 AssertionError, message % (expected, actual), meth
1090 )
1091
1092
1093 def test_mock_calls(self):
1094 mock = MagicMock()
1095
1096 # need to do this because MagicMock.mock_calls used to just return
1097 # a MagicMock which also returned a MagicMock when __eq__ was called
1098 self.assertIs(mock.mock_calls == [], True)
1099
1100 mock = MagicMock()
1101 mock()
1102 expected = [('', (), {})]
1103 self.assertEqual(mock.mock_calls, expected)
1104
1105 mock.foo()
1106 expected.append(call.foo())
1107 self.assertEqual(mock.mock_calls, expected)
1108 # intermediate mock_calls work too
1109 self.assertEqual(mock.foo.mock_calls, [('', (), {})])
1110
1111 mock = MagicMock()
1112 mock().foo(1, 2, 3, a=4, b=5)
1113 expected = [
1114 ('', (), {}), ('().foo', (1, 2, 3), dict(a=4, b=5))
1115 ]
1116 self.assertEqual(mock.mock_calls, expected)
1117 self.assertEqual(mock.return_value.foo.mock_calls,
1118 [('', (1, 2, 3), dict(a=4, b=5))])
1119 self.assertEqual(mock.return_value.mock_calls,
1120 [('foo', (1, 2, 3), dict(a=4, b=5))])
1121
1122 mock = MagicMock()
1123 mock().foo.bar().baz()
1124 expected = [
1125 ('', (), {}), ('().foo.bar', (), {}),
1126 ('().foo.bar().baz', (), {})
1127 ]
1128 self.assertEqual(mock.mock_calls, expected)
1129 self.assertEqual(mock().mock_calls,
1130 call.foo.bar().baz().call_list())
1131
1132 for kwargs in dict(), dict(name='bar'):
1133 mock = MagicMock(**kwargs)
1134 int(mock.foo)
1135 expected = [('foo.__int__', (), {})]
1136 self.assertEqual(mock.mock_calls, expected)
1137
1138 mock = MagicMock(**kwargs)
1139 mock.a()()
1140 expected = [('a', (), {}), ('a()', (), {})]
1141 self.assertEqual(mock.mock_calls, expected)
1142 self.assertEqual(mock.a().mock_calls, [call()])
1143
1144 mock = MagicMock(**kwargs)
1145 mock(1)(2)(3)
1146 self.assertEqual(mock.mock_calls, call(1)(2)(3).call_list())
1147 self.assertEqual(mock().mock_calls, call(2)(3).call_list())
1148 self.assertEqual(mock()().mock_calls, call(3).call_list())
1149
1150 mock = MagicMock(**kwargs)
1151 mock(1)(2)(3).a.b.c(4)
1152 self.assertEqual(mock.mock_calls,
1153 call(1)(2)(3).a.b.c(4).call_list())
1154 self.assertEqual(mock().mock_calls,
1155 call(2)(3).a.b.c(4).call_list())
1156 self.assertEqual(mock()().mock_calls,
1157 call(3).a.b.c(4).call_list())
1158
1159 mock = MagicMock(**kwargs)
1160 int(mock().foo.bar().baz())
1161 last_call = ('().foo.bar().baz().__int__', (), {})
1162 self.assertEqual(mock.mock_calls[-1], last_call)
1163 self.assertEqual(mock().mock_calls,
1164 call.foo.bar().baz().__int__().call_list())
1165 self.assertEqual(mock().foo.bar().mock_calls,
1166 call.baz().__int__().call_list())
1167 self.assertEqual(mock().foo.bar().baz.mock_calls,
1168 call().__int__().call_list())
1169
1170
1171 def test_child_mock_call_equal(self):
1172 m = Mock()
1173 result = m()
1174 result.wibble()
1175 # parent looks like this:
1176 self.assertEqual(m.mock_calls, [call(), call().wibble()])
1177 # but child should look like this:
1178 self.assertEqual(result.mock_calls, [call.wibble()])
1179
1180
1181 def test_mock_call_not_equal_leaf(self):
1182 m = Mock()
1183 m.foo().something()
1184 self.assertNotEqual(m.mock_calls[1], call.foo().different())
1185 self.assertEqual(m.mock_calls[0], call.foo())
1186
1187
1188 def test_mock_call_not_equal_non_leaf(self):
1189 m = Mock()
1190 m.foo().bar()
1191 self.assertNotEqual(m.mock_calls[1], call.baz().bar())
1192 self.assertNotEqual(m.mock_calls[0], call.baz())
1193
1194
1195 def test_mock_call_not_equal_non_leaf_params_different(self):
1196 m = Mock()
1197 m.foo(x=1).bar()
1198 # This isn't ideal, but there's no way to fix it without breaking backwards compatibility:
1199 self.assertEqual(m.mock_calls[1], call.foo(x=2).bar())
1200
1201
1202 def test_mock_call_not_equal_non_leaf_attr(self):
1203 m = Mock()
1204 m.foo.bar()
1205 self.assertNotEqual(m.mock_calls[0], call.baz.bar())
1206
1207
1208 def test_mock_call_not_equal_non_leaf_call_versus_attr(self):
1209 m = Mock()
1210 m.foo.bar()
1211 self.assertNotEqual(m.mock_calls[0], call.foo().bar())
1212
1213
1214 def test_mock_call_repr(self):
1215 m = Mock()
1216 m.foo().bar().baz.bob()
1217 self.assertEqual(repr(m.mock_calls[0]), 'call.foo()')
1218 self.assertEqual(repr(m.mock_calls[1]), 'call.foo().bar()')
1219 self.assertEqual(repr(m.mock_calls[2]), 'call.foo().bar().baz.bob()')
1220
1221
1222 def test_mock_call_repr_loop(self):
1223 m = Mock()
1224 m.foo = m
1225 repr(m.foo())
1226 self.assertRegex(repr(m.foo()), r"<Mock name='mock\(\)' id='\d+'>")
1227
1228
1229 def test_mock_calls_contains(self):
1230 m = Mock()
1231 self.assertFalse([call()] in m.mock_calls)
1232
1233
1234 def test_subclassing(self):
1235 class ESC[4;38;5;81mSubclass(ESC[4;38;5;149mMock):
1236 pass
1237
1238 mock = Subclass()
1239 self.assertIsInstance(mock.foo, Subclass)
1240 self.assertIsInstance(mock(), Subclass)
1241
1242 class ESC[4;38;5;81mSubclass(ESC[4;38;5;149mMock):
1243 def _get_child_mock(self, **kwargs):
1244 return Mock(**kwargs)
1245
1246 mock = Subclass()
1247 self.assertNotIsInstance(mock.foo, Subclass)
1248 self.assertNotIsInstance(mock(), Subclass)
1249
1250
1251 def test_arg_lists(self):
1252 mocks = [
1253 Mock(),
1254 MagicMock(),
1255 NonCallableMock(),
1256 NonCallableMagicMock()
1257 ]
1258
1259 def assert_attrs(mock):
1260 names = 'call_args_list', 'method_calls', 'mock_calls'
1261 for name in names:
1262 attr = getattr(mock, name)
1263 self.assertIsInstance(attr, _CallList)
1264 self.assertIsInstance(attr, list)
1265 self.assertEqual(attr, [])
1266
1267 for mock in mocks:
1268 assert_attrs(mock)
1269
1270 if callable(mock):
1271 mock()
1272 mock(1, 2)
1273 mock(a=3)
1274
1275 mock.reset_mock()
1276 assert_attrs(mock)
1277
1278 mock.foo()
1279 mock.foo.bar(1, a=3)
1280 mock.foo(1).bar().baz(3)
1281
1282 mock.reset_mock()
1283 assert_attrs(mock)
1284
1285
1286 def test_call_args_two_tuple(self):
1287 mock = Mock()
1288 mock(1, a=3)
1289 mock(2, b=4)
1290
1291 self.assertEqual(len(mock.call_args), 2)
1292 self.assertEqual(mock.call_args.args, (2,))
1293 self.assertEqual(mock.call_args.kwargs, dict(b=4))
1294
1295 expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))]
1296 for expected, call_args in zip(expected_list, mock.call_args_list):
1297 self.assertEqual(len(call_args), 2)
1298 self.assertEqual(expected[0], call_args[0])
1299 self.assertEqual(expected[1], call_args[1])
1300
1301
1302 def test_side_effect_iterator(self):
1303 mock = Mock(side_effect=iter([1, 2, 3]))
1304 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1305 self.assertRaises(StopIteration, mock)
1306
1307 mock = MagicMock(side_effect=['a', 'b', 'c'])
1308 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1309 self.assertRaises(StopIteration, mock)
1310
1311 mock = Mock(side_effect='ghi')
1312 self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i'])
1313 self.assertRaises(StopIteration, mock)
1314
1315 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
1316 pass
1317 mock = MagicMock(side_effect=Foo)
1318 self.assertIsInstance(mock(), Foo)
1319
1320 mock = Mock(side_effect=Iter())
1321 self.assertEqual([mock(), mock(), mock(), mock()],
1322 ['this', 'is', 'an', 'iter'])
1323 self.assertRaises(StopIteration, mock)
1324
1325
1326 def test_side_effect_iterator_exceptions(self):
1327 for Klass in Mock, MagicMock:
1328 iterable = (ValueError, 3, KeyError, 6)
1329 m = Klass(side_effect=iterable)
1330 self.assertRaises(ValueError, m)
1331 self.assertEqual(m(), 3)
1332 self.assertRaises(KeyError, m)
1333 self.assertEqual(m(), 6)
1334
1335
1336 def test_side_effect_setting_iterator(self):
1337 mock = Mock()
1338 mock.side_effect = iter([1, 2, 3])
1339 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1340 self.assertRaises(StopIteration, mock)
1341 side_effect = mock.side_effect
1342 self.assertIsInstance(side_effect, type(iter([])))
1343
1344 mock.side_effect = ['a', 'b', 'c']
1345 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1346 self.assertRaises(StopIteration, mock)
1347 side_effect = mock.side_effect
1348 self.assertIsInstance(side_effect, type(iter([])))
1349
1350 this_iter = Iter()
1351 mock.side_effect = this_iter
1352 self.assertEqual([mock(), mock(), mock(), mock()],
1353 ['this', 'is', 'an', 'iter'])
1354 self.assertRaises(StopIteration, mock)
1355 self.assertIs(mock.side_effect, this_iter)
1356
1357 def test_side_effect_iterator_default(self):
1358 mock = Mock(return_value=2)
1359 mock.side_effect = iter([1, DEFAULT])
1360 self.assertEqual([mock(), mock()], [1, 2])
1361
1362 def test_assert_has_calls_any_order(self):
1363 mock = Mock()
1364 mock(1, 2)
1365 mock(a=3)
1366 mock(3, 4)
1367 mock(b=6)
1368 mock(b=6)
1369
1370 kalls = [
1371 call(1, 2), ({'a': 3},),
1372 ((3, 4),), ((), {'a': 3}),
1373 ('', (1, 2)), ('', {'a': 3}),
1374 ('', (1, 2), {}), ('', (), {'a': 3})
1375 ]
1376 for kall in kalls:
1377 mock.assert_has_calls([kall], any_order=True)
1378
1379 for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
1380 self.assertRaises(
1381 AssertionError, mock.assert_has_calls,
1382 [kall], any_order=True
1383 )
1384
1385 kall_lists = [
1386 [call(1, 2), call(b=6)],
1387 [call(3, 4), call(1, 2)],
1388 [call(b=6), call(b=6)],
1389 ]
1390
1391 for kall_list in kall_lists:
1392 mock.assert_has_calls(kall_list, any_order=True)
1393
1394 kall_lists = [
1395 [call(b=6), call(b=6), call(b=6)],
1396 [call(1, 2), call(1, 2)],
1397 [call(3, 4), call(1, 2), call(5, 7)],
1398 [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
1399 ]
1400 for kall_list in kall_lists:
1401 self.assertRaises(
1402 AssertionError, mock.assert_has_calls,
1403 kall_list, any_order=True
1404 )
1405
1406 def test_assert_has_calls(self):
1407 kalls1 = [
1408 call(1, 2), ({'a': 3},),
1409 ((3, 4),), call(b=6),
1410 ('', (1,), {'b': 6}),
1411 ]
1412 kalls2 = [call.foo(), call.bar(1)]
1413 kalls2.extend(call.spam().baz(a=3).call_list())
1414 kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
1415
1416 mocks = []
1417 for mock in Mock(), MagicMock():
1418 mock(1, 2)
1419 mock(a=3)
1420 mock(3, 4)
1421 mock(b=6)
1422 mock(1, b=6)
1423 mocks.append((mock, kalls1))
1424
1425 mock = Mock()
1426 mock.foo()
1427 mock.bar(1)
1428 mock.spam().baz(a=3)
1429 mock.bam(set(), foo={}).fish([1])
1430 mocks.append((mock, kalls2))
1431
1432 for mock, kalls in mocks:
1433 for i in range(len(kalls)):
1434 for step in 1, 2, 3:
1435 these = kalls[i:i+step]
1436 mock.assert_has_calls(these)
1437
1438 if len(these) > 1:
1439 self.assertRaises(
1440 AssertionError,
1441 mock.assert_has_calls,
1442 list(reversed(these))
1443 )
1444
1445
1446 def test_assert_has_calls_nested_spec(self):
1447 class ESC[4;38;5;81mSomething:
1448
1449 def __init__(self): pass
1450 def meth(self, a, b, c, d=None): pass
1451
1452 class ESC[4;38;5;81mFoo:
1453
1454 def __init__(self, a): pass
1455 def meth1(self, a, b): pass
1456
1457 mock_class = create_autospec(Something)
1458
1459 for m in [mock_class, mock_class()]:
1460 m.meth(1, 2, 3, d=1)
1461 m.assert_has_calls([call.meth(1, 2, 3, d=1)])
1462 m.assert_has_calls([call.meth(1, 2, 3, 1)])
1463
1464 mock_class.reset_mock()
1465
1466 for m in [mock_class, mock_class()]:
1467 self.assertRaises(AssertionError, m.assert_has_calls, [call.Foo()])
1468 m.Foo(1).meth1(1, 2)
1469 m.assert_has_calls([call.Foo(1), call.Foo(1).meth1(1, 2)])
1470 m.Foo.assert_has_calls([call(1), call().meth1(1, 2)])
1471
1472 mock_class.reset_mock()
1473
1474 invalid_calls = [call.meth(1),
1475 call.non_existent(1),
1476 call.Foo().non_existent(1),
1477 call.Foo().meth(1, 2, 3, 4)]
1478
1479 for kall in invalid_calls:
1480 self.assertRaises(AssertionError,
1481 mock_class.assert_has_calls,
1482 [kall]
1483 )
1484
1485
1486 def test_assert_has_calls_nested_without_spec(self):
1487 m = MagicMock()
1488 m().foo().bar().baz()
1489 m.one().two().three()
1490 calls = call.one().two().three().call_list()
1491 m.assert_has_calls(calls)
1492
1493
1494 def test_assert_has_calls_with_function_spec(self):
1495 def f(a, b, c, d=None): pass
1496
1497 mock = Mock(spec=f)
1498
1499 mock(1, b=2, c=3)
1500 mock(4, 5, c=6, d=7)
1501 mock(10, 11, c=12)
1502 calls = [
1503 ('', (1, 2, 3), {}),
1504 ('', (4, 5, 6), {'d': 7}),
1505 ((10, 11, 12), {}),
1506 ]
1507 mock.assert_has_calls(calls)
1508 mock.assert_has_calls(calls, any_order=True)
1509 mock.assert_has_calls(calls[1:])
1510 mock.assert_has_calls(calls[1:], any_order=True)
1511 mock.assert_has_calls(calls[:-1])
1512 mock.assert_has_calls(calls[:-1], any_order=True)
1513 # Reversed order
1514 calls = list(reversed(calls))
1515 with self.assertRaises(AssertionError):
1516 mock.assert_has_calls(calls)
1517 mock.assert_has_calls(calls, any_order=True)
1518 with self.assertRaises(AssertionError):
1519 mock.assert_has_calls(calls[1:])
1520 mock.assert_has_calls(calls[1:], any_order=True)
1521 with self.assertRaises(AssertionError):
1522 mock.assert_has_calls(calls[:-1])
1523 mock.assert_has_calls(calls[:-1], any_order=True)
1524
1525 def test_assert_has_calls_not_matching_spec_error(self):
1526 def f(x=None): pass
1527
1528 mock = Mock(spec=f)
1529 mock(1)
1530
1531 with self.assertRaisesRegex(
1532 AssertionError,
1533 '^{}$'.format(
1534 re.escape('Calls not found.\n'
1535 'Expected: [call()]\n'
1536 'Actual: [call(1)]'))) as cm:
1537 mock.assert_has_calls([call()])
1538 self.assertIsNone(cm.exception.__cause__)
1539
1540
1541 with self.assertRaisesRegex(
1542 AssertionError,
1543 '^{}$'.format(
1544 re.escape(
1545 'Error processing expected calls.\n'
1546 "Errors: [None, TypeError('too many positional arguments')]\n"
1547 "Expected: [call(), call(1, 2)]\n"
1548 'Actual: [call(1)]'))) as cm:
1549 mock.assert_has_calls([call(), call(1, 2)])
1550 self.assertIsInstance(cm.exception.__cause__, TypeError)
1551
1552 def test_assert_any_call(self):
1553 mock = Mock()
1554 mock(1, 2)
1555 mock(a=3)
1556 mock(1, b=6)
1557
1558 mock.assert_any_call(1, 2)
1559 mock.assert_any_call(a=3)
1560 mock.assert_any_call(1, b=6)
1561
1562 self.assertRaises(
1563 AssertionError,
1564 mock.assert_any_call
1565 )
1566 self.assertRaises(
1567 AssertionError,
1568 mock.assert_any_call,
1569 1, 3
1570 )
1571 self.assertRaises(
1572 AssertionError,
1573 mock.assert_any_call,
1574 a=4
1575 )
1576
1577
1578 def test_assert_any_call_with_function_spec(self):
1579 def f(a, b, c, d=None): pass
1580
1581 mock = Mock(spec=f)
1582
1583 mock(1, b=2, c=3)
1584 mock(4, 5, c=6, d=7)
1585 mock.assert_any_call(1, 2, 3)
1586 mock.assert_any_call(a=1, b=2, c=3)
1587 mock.assert_any_call(4, 5, 6, 7)
1588 mock.assert_any_call(a=4, b=5, c=6, d=7)
1589 self.assertRaises(AssertionError, mock.assert_any_call,
1590 1, b=3, c=2)
1591 # Expected call doesn't match the spec's signature
1592 with self.assertRaises(AssertionError) as cm:
1593 mock.assert_any_call(e=8)
1594 self.assertIsInstance(cm.exception.__cause__, TypeError)
1595
1596
1597 def test_mock_calls_create_autospec(self):
1598 def f(a, b): pass
1599 obj = Iter()
1600 obj.f = f
1601
1602 funcs = [
1603 create_autospec(f),
1604 create_autospec(obj).f
1605 ]
1606 for func in funcs:
1607 func(1, 2)
1608 func(3, 4)
1609
1610 self.assertEqual(
1611 func.mock_calls, [call(1, 2), call(3, 4)]
1612 )
1613
1614 #Issue21222
1615 def test_create_autospec_with_name(self):
1616 m = mock.create_autospec(object(), name='sweet_func')
1617 self.assertIn('sweet_func', repr(m))
1618
1619 #Issue23078
1620 def test_create_autospec_classmethod_and_staticmethod(self):
1621 class ESC[4;38;5;81mTestClass:
1622 @classmethod
1623 def class_method(cls): pass
1624
1625 @staticmethod
1626 def static_method(): pass
1627 for method in ('class_method', 'static_method'):
1628 with self.subTest(method=method):
1629 mock_method = mock.create_autospec(getattr(TestClass, method))
1630 mock_method()
1631 mock_method.assert_called_once_with()
1632 self.assertRaises(TypeError, mock_method, 'extra_arg')
1633
1634 #Issue21238
1635 def test_mock_unsafe(self):
1636 m = Mock()
1637 msg = "is not a valid assertion. Use a spec for the mock"
1638 with self.assertRaisesRegex(AttributeError, msg):
1639 m.assert_foo_call()
1640 with self.assertRaisesRegex(AttributeError, msg):
1641 m.assret_foo_call()
1642 with self.assertRaisesRegex(AttributeError, msg):
1643 m.asert_foo_call()
1644 with self.assertRaisesRegex(AttributeError, msg):
1645 m.aseert_foo_call()
1646 with self.assertRaisesRegex(AttributeError, msg):
1647 m.assrt_foo_call()
1648 with self.assertRaisesRegex(AttributeError, msg):
1649 m.called_once_with()
1650 with self.assertRaisesRegex(AttributeError, msg):
1651 m.called_once()
1652 with self.assertRaisesRegex(AttributeError, msg):
1653 m.has_calls()
1654
1655 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
1656 def called_once(self): pass
1657
1658 def has_calls(self): pass
1659
1660 m = Mock(spec=Foo)
1661 m.called_once()
1662 m.has_calls()
1663
1664 m.called_once.assert_called_once()
1665 m.has_calls.assert_called_once()
1666
1667 m = Mock(unsafe=True)
1668 m.assert_foo_call()
1669 m.assret_foo_call()
1670 m.asert_foo_call()
1671 m.aseert_foo_call()
1672 m.assrt_foo_call()
1673 m.called_once()
1674 m.called_once_with()
1675 m.has_calls()
1676
1677 # gh-100739
1678 def test_mock_safe_with_spec(self):
1679 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
1680 def assert_bar(self): pass
1681
1682 def assertSome(self): pass
1683
1684 m = Mock(spec=Foo)
1685 m.assert_bar()
1686 m.assertSome()
1687
1688 m.assert_bar.assert_called_once()
1689 m.assertSome.assert_called_once()
1690
1691 #Issue21262
1692 def test_assert_not_called(self):
1693 m = Mock()
1694 m.hello.assert_not_called()
1695 m.hello()
1696 with self.assertRaises(AssertionError):
1697 m.hello.assert_not_called()
1698
1699 def test_assert_not_called_message(self):
1700 m = Mock()
1701 m(1, 2)
1702 self.assertRaisesRegex(AssertionError,
1703 re.escape("Calls: [call(1, 2)]"),
1704 m.assert_not_called)
1705
1706 def test_assert_called(self):
1707 m = Mock()
1708 with self.assertRaises(AssertionError):
1709 m.hello.assert_called()
1710 m.hello()
1711 m.hello.assert_called()
1712
1713 m.hello()
1714 m.hello.assert_called()
1715
1716 def test_assert_called_once(self):
1717 m = Mock()
1718 with self.assertRaises(AssertionError):
1719 m.hello.assert_called_once()
1720 m.hello()
1721 m.hello.assert_called_once()
1722
1723 m.hello()
1724 with self.assertRaises(AssertionError):
1725 m.hello.assert_called_once()
1726
1727 def test_assert_called_once_message(self):
1728 m = Mock()
1729 m(1, 2)
1730 m(3)
1731 self.assertRaisesRegex(AssertionError,
1732 re.escape("Calls: [call(1, 2), call(3)]"),
1733 m.assert_called_once)
1734
1735 def test_assert_called_once_message_not_called(self):
1736 m = Mock()
1737 with self.assertRaises(AssertionError) as e:
1738 m.assert_called_once()
1739 self.assertNotIn("Calls:", str(e.exception))
1740
1741 #Issue37212 printout of keyword args now preserves the original order
1742 def test_ordered_call_signature(self):
1743 m = Mock()
1744 m.hello(name='hello', daddy='hero')
1745 text = "call(name='hello', daddy='hero')"
1746 self.assertEqual(repr(m.hello.call_args), text)
1747
1748 #Issue21270 overrides tuple methods for mock.call objects
1749 def test_override_tuple_methods(self):
1750 c = call.count()
1751 i = call.index(132,'hello')
1752 m = Mock()
1753 m.count()
1754 m.index(132,"hello")
1755 self.assertEqual(m.method_calls[0], c)
1756 self.assertEqual(m.method_calls[1], i)
1757
1758 def test_reset_return_sideeffect(self):
1759 m = Mock(return_value=10, side_effect=[2,3])
1760 m.reset_mock(return_value=True, side_effect=True)
1761 self.assertIsInstance(m.return_value, Mock)
1762 self.assertEqual(m.side_effect, None)
1763
1764 def test_reset_return(self):
1765 m = Mock(return_value=10, side_effect=[2,3])
1766 m.reset_mock(return_value=True)
1767 self.assertIsInstance(m.return_value, Mock)
1768 self.assertNotEqual(m.side_effect, None)
1769
1770 def test_reset_sideeffect(self):
1771 m = Mock(return_value=10, side_effect=[2, 3])
1772 m.reset_mock(side_effect=True)
1773 self.assertEqual(m.return_value, 10)
1774 self.assertEqual(m.side_effect, None)
1775
1776 def test_reset_return_with_children(self):
1777 m = MagicMock(f=MagicMock(return_value=1))
1778 self.assertEqual(m.f(), 1)
1779 m.reset_mock(return_value=True)
1780 self.assertNotEqual(m.f(), 1)
1781
1782 def test_reset_return_with_children_side_effect(self):
1783 m = MagicMock(f=MagicMock(side_effect=[2, 3]))
1784 self.assertNotEqual(m.f.side_effect, None)
1785 m.reset_mock(side_effect=True)
1786 self.assertEqual(m.f.side_effect, None)
1787
1788 def test_mock_add_spec(self):
1789 class ESC[4;38;5;81m_One(ESC[4;38;5;149mobject):
1790 one = 1
1791 class ESC[4;38;5;81m_Two(ESC[4;38;5;149mobject):
1792 two = 2
1793 class ESC[4;38;5;81mAnything(ESC[4;38;5;149mobject):
1794 one = two = three = 'four'
1795
1796 klasses = [
1797 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
1798 ]
1799 for Klass in list(klasses):
1800 klasses.append(lambda K=Klass: K(spec=Anything))
1801 klasses.append(lambda K=Klass: K(spec_set=Anything))
1802
1803 for Klass in klasses:
1804 for kwargs in dict(), dict(spec_set=True):
1805 mock = Klass()
1806 #no error
1807 mock.one, mock.two, mock.three
1808
1809 for One, Two in [(_One, _Two), (['one'], ['two'])]:
1810 for kwargs in dict(), dict(spec_set=True):
1811 mock.mock_add_spec(One, **kwargs)
1812
1813 mock.one
1814 self.assertRaises(
1815 AttributeError, getattr, mock, 'two'
1816 )
1817 self.assertRaises(
1818 AttributeError, getattr, mock, 'three'
1819 )
1820 if 'spec_set' in kwargs:
1821 self.assertRaises(
1822 AttributeError, setattr, mock, 'three', None
1823 )
1824
1825 mock.mock_add_spec(Two, **kwargs)
1826 self.assertRaises(
1827 AttributeError, getattr, mock, 'one'
1828 )
1829 mock.two
1830 self.assertRaises(
1831 AttributeError, getattr, mock, 'three'
1832 )
1833 if 'spec_set' in kwargs:
1834 self.assertRaises(
1835 AttributeError, setattr, mock, 'three', None
1836 )
1837 # note that creating a mock, setting an instance attribute, and
1838 # *then* setting a spec doesn't work. Not the intended use case
1839
1840
1841 def test_mock_add_spec_magic_methods(self):
1842 for Klass in MagicMock, NonCallableMagicMock:
1843 mock = Klass()
1844 int(mock)
1845
1846 mock.mock_add_spec(object)
1847 self.assertRaises(TypeError, int, mock)
1848
1849 mock = Klass()
1850 mock['foo']
1851 mock.__int__.return_value =4
1852
1853 mock.mock_add_spec(int)
1854 self.assertEqual(int(mock), 4)
1855 self.assertRaises(TypeError, lambda: mock['foo'])
1856
1857
1858 def test_adding_child_mock(self):
1859 for Klass in (NonCallableMock, Mock, MagicMock, NonCallableMagicMock,
1860 AsyncMock):
1861 mock = Klass()
1862
1863 mock.foo = Mock()
1864 mock.foo()
1865
1866 self.assertEqual(mock.method_calls, [call.foo()])
1867 self.assertEqual(mock.mock_calls, [call.foo()])
1868
1869 mock = Klass()
1870 mock.bar = Mock(name='name')
1871 mock.bar()
1872 self.assertEqual(mock.method_calls, [])
1873 self.assertEqual(mock.mock_calls, [])
1874
1875 # mock with an existing _new_parent but no name
1876 mock = Klass()
1877 mock.baz = MagicMock()()
1878 mock.baz()
1879 self.assertEqual(mock.method_calls, [])
1880 self.assertEqual(mock.mock_calls, [])
1881
1882
1883 def test_adding_return_value_mock(self):
1884 for Klass in Mock, MagicMock:
1885 mock = Klass()
1886 mock.return_value = MagicMock()
1887
1888 mock()()
1889 self.assertEqual(mock.mock_calls, [call(), call()()])
1890
1891
1892 def test_manager_mock(self):
1893 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
1894 one = 'one'
1895 two = 'two'
1896 manager = Mock()
1897 p1 = patch.object(Foo, 'one')
1898 p2 = patch.object(Foo, 'two')
1899
1900 mock_one = p1.start()
1901 self.addCleanup(p1.stop)
1902 mock_two = p2.start()
1903 self.addCleanup(p2.stop)
1904
1905 manager.attach_mock(mock_one, 'one')
1906 manager.attach_mock(mock_two, 'two')
1907
1908 Foo.two()
1909 Foo.one()
1910
1911 self.assertEqual(manager.mock_calls, [call.two(), call.one()])
1912
1913
1914 def test_magic_methods_mock_calls(self):
1915 for Klass in Mock, MagicMock:
1916 m = Klass()
1917 m.__int__ = Mock(return_value=3)
1918 m.__float__ = MagicMock(return_value=3.0)
1919 int(m)
1920 float(m)
1921
1922 self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
1923 self.assertEqual(m.method_calls, [])
1924
1925 def test_mock_open_reuse_issue_21750(self):
1926 mocked_open = mock.mock_open(read_data='data')
1927 f1 = mocked_open('a-name')
1928 f1_data = f1.read()
1929 f2 = mocked_open('another-name')
1930 f2_data = f2.read()
1931 self.assertEqual(f1_data, f2_data)
1932
1933 def test_mock_open_dunder_iter_issue(self):
1934 # Test dunder_iter method generates the expected result and
1935 # consumes the iterator.
1936 mocked_open = mock.mock_open(read_data='Remarkable\nNorwegian Blue')
1937 f1 = mocked_open('a-name')
1938 lines = [line for line in f1]
1939 self.assertEqual(lines[0], 'Remarkable\n')
1940 self.assertEqual(lines[1], 'Norwegian Blue')
1941 self.assertEqual(list(f1), [])
1942
1943 def test_mock_open_using_next(self):
1944 mocked_open = mock.mock_open(read_data='1st line\n2nd line\n3rd line')
1945 f1 = mocked_open('a-name')
1946 line1 = next(f1)
1947 line2 = f1.__next__()
1948 lines = [line for line in f1]
1949 self.assertEqual(line1, '1st line\n')
1950 self.assertEqual(line2, '2nd line\n')
1951 self.assertEqual(lines[0], '3rd line')
1952 self.assertEqual(list(f1), [])
1953 with self.assertRaises(StopIteration):
1954 next(f1)
1955
1956 def test_mock_open_next_with_readline_with_return_value(self):
1957 mopen = mock.mock_open(read_data='foo\nbarn')
1958 mopen.return_value.readline.return_value = 'abc'
1959 self.assertEqual('abc', next(mopen()))
1960
1961 def test_mock_open_write(self):
1962 # Test exception in file writing write()
1963 mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV'))
1964 with mock.patch('tempfile.NamedTemporaryFile', mock_namedtemp):
1965 mock_filehandle = mock_namedtemp.return_value
1966 mock_write = mock_filehandle.write
1967 mock_write.side_effect = OSError('Test 2 Error')
1968 def attempt():
1969 tempfile.NamedTemporaryFile().write('asd')
1970 self.assertRaises(OSError, attempt)
1971
1972 def test_mock_open_alter_readline(self):
1973 mopen = mock.mock_open(read_data='foo\nbarn')
1974 mopen.return_value.readline.side_effect = lambda *args:'abc'
1975 first = mopen().readline()
1976 second = mopen().readline()
1977 self.assertEqual('abc', first)
1978 self.assertEqual('abc', second)
1979
1980 def test_mock_open_after_eof(self):
1981 # read, readline and readlines should work after end of file.
1982 _open = mock.mock_open(read_data='foo')
1983 h = _open('bar')
1984 h.read()
1985 self.assertEqual('', h.read())
1986 self.assertEqual('', h.read())
1987 self.assertEqual('', h.readline())
1988 self.assertEqual('', h.readline())
1989 self.assertEqual([], h.readlines())
1990 self.assertEqual([], h.readlines())
1991
1992 def test_mock_parents(self):
1993 for Klass in Mock, MagicMock:
1994 m = Klass()
1995 original_repr = repr(m)
1996 m.return_value = m
1997 self.assertIs(m(), m)
1998 self.assertEqual(repr(m), original_repr)
1999
2000 m.reset_mock()
2001 self.assertIs(m(), m)
2002 self.assertEqual(repr(m), original_repr)
2003
2004 m = Klass()
2005 m.b = m.a
2006 self.assertIn("name='mock.a'", repr(m.b))
2007 self.assertIn("name='mock.a'", repr(m.a))
2008 m.reset_mock()
2009 self.assertIn("name='mock.a'", repr(m.b))
2010 self.assertIn("name='mock.a'", repr(m.a))
2011
2012 m = Klass()
2013 original_repr = repr(m)
2014 m.a = m()
2015 m.a.return_value = m
2016
2017 self.assertEqual(repr(m), original_repr)
2018 self.assertEqual(repr(m.a()), original_repr)
2019
2020
2021 def test_attach_mock(self):
2022 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
2023 for Klass in classes:
2024 for Klass2 in classes:
2025 m = Klass()
2026
2027 m2 = Klass2(name='foo')
2028 m.attach_mock(m2, 'bar')
2029
2030 self.assertIs(m.bar, m2)
2031 self.assertIn("name='mock.bar'", repr(m2))
2032
2033 m.bar.baz(1)
2034 self.assertEqual(m.mock_calls, [call.bar.baz(1)])
2035 self.assertEqual(m.method_calls, [call.bar.baz(1)])
2036
2037
2038 def test_attach_mock_return_value(self):
2039 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
2040 for Klass in Mock, MagicMock:
2041 for Klass2 in classes:
2042 m = Klass()
2043
2044 m2 = Klass2(name='foo')
2045 m.attach_mock(m2, 'return_value')
2046
2047 self.assertIs(m(), m2)
2048 self.assertIn("name='mock()'", repr(m2))
2049
2050 m2.foo()
2051 self.assertEqual(m.mock_calls, call().foo().call_list())
2052
2053
2054 def test_attach_mock_patch_autospec(self):
2055 parent = Mock()
2056
2057 with mock.patch(f'{__name__}.something', autospec=True) as mock_func:
2058 self.assertEqual(mock_func.mock._extract_mock_name(), 'something')
2059 parent.attach_mock(mock_func, 'child')
2060 parent.child(1)
2061 something(2)
2062 mock_func(3)
2063
2064 parent_calls = [call.child(1), call.child(2), call.child(3)]
2065 child_calls = [call(1), call(2), call(3)]
2066 self.assertEqual(parent.mock_calls, parent_calls)
2067 self.assertEqual(parent.child.mock_calls, child_calls)
2068 self.assertEqual(something.mock_calls, child_calls)
2069 self.assertEqual(mock_func.mock_calls, child_calls)
2070 self.assertIn('mock.child', repr(parent.child.mock))
2071 self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child')
2072
2073
2074 def test_attach_mock_patch_autospec_signature(self):
2075 with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked:
2076 manager = Mock()
2077 manager.attach_mock(mocked, 'attach_meth')
2078 obj = Something()
2079 obj.meth(1, 2, 3, d=4)
2080 manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)])
2081 obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
2082 mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
2083
2084 with mock.patch(f'{__name__}.something', autospec=True) as mocked:
2085 manager = Mock()
2086 manager.attach_mock(mocked, 'attach_func')
2087 something(1)
2088 manager.assert_has_calls([call.attach_func(1)])
2089 something.assert_has_calls([call(1)])
2090 mocked.assert_has_calls([call(1)])
2091
2092 with mock.patch(f'{__name__}.Something', autospec=True) as mocked:
2093 manager = Mock()
2094 manager.attach_mock(mocked, 'attach_obj')
2095 obj = Something()
2096 obj.meth(1, 2, 3, d=4)
2097 manager.assert_has_calls([call.attach_obj(),
2098 call.attach_obj().meth(1, 2, 3, d=4)])
2099 obj.meth.assert_has_calls([call(1, 2, 3, d=4)])
2100 mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)])
2101
2102
2103 def test_attribute_deletion(self):
2104 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2105 NonCallableMock()):
2106 self.assertTrue(hasattr(mock, 'm'))
2107
2108 del mock.m
2109 self.assertFalse(hasattr(mock, 'm'))
2110
2111 del mock.f
2112 self.assertFalse(hasattr(mock, 'f'))
2113 self.assertRaises(AttributeError, getattr, mock, 'f')
2114
2115
2116 def test_mock_does_not_raise_on_repeated_attribute_deletion(self):
2117 # bpo-20239: Assigning and deleting twice an attribute raises.
2118 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2119 NonCallableMock()):
2120 mock.foo = 3
2121 self.assertTrue(hasattr(mock, 'foo'))
2122 self.assertEqual(mock.foo, 3)
2123
2124 del mock.foo
2125 self.assertFalse(hasattr(mock, 'foo'))
2126
2127 mock.foo = 4
2128 self.assertTrue(hasattr(mock, 'foo'))
2129 self.assertEqual(mock.foo, 4)
2130
2131 del mock.foo
2132 self.assertFalse(hasattr(mock, 'foo'))
2133
2134
2135 def test_mock_raises_when_deleting_nonexistent_attribute(self):
2136 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2137 NonCallableMock()):
2138 del mock.foo
2139 with self.assertRaises(AttributeError):
2140 del mock.foo
2141
2142
2143 def test_reset_mock_does_not_raise_on_attr_deletion(self):
2144 # bpo-31177: reset_mock should not raise AttributeError when attributes
2145 # were deleted in a mock instance
2146 mock = Mock()
2147 mock.child = True
2148 del mock.child
2149 mock.reset_mock()
2150 self.assertFalse(hasattr(mock, 'child'))
2151
2152
2153 def test_class_assignable(self):
2154 for mock in Mock(), MagicMock():
2155 self.assertNotIsInstance(mock, int)
2156
2157 mock.__class__ = int
2158 self.assertIsInstance(mock, int)
2159 mock.foo
2160
2161 def test_name_attribute_of_call(self):
2162 # bpo-35357: _Call should not disclose any attributes whose names
2163 # may clash with popular ones (such as ".name")
2164 self.assertIsNotNone(call.name)
2165 self.assertEqual(type(call.name), _Call)
2166 self.assertEqual(type(call.name().name), _Call)
2167
2168 def test_parent_attribute_of_call(self):
2169 # bpo-35357: _Call should not disclose any attributes whose names
2170 # may clash with popular ones (such as ".parent")
2171 self.assertIsNotNone(call.parent)
2172 self.assertEqual(type(call.parent), _Call)
2173 self.assertEqual(type(call.parent().parent), _Call)
2174
2175
2176 def test_parent_propagation_with_create_autospec(self):
2177
2178 def foo(a, b): pass
2179
2180 mock = Mock()
2181 mock.child = create_autospec(foo)
2182 mock.child(1, 2)
2183
2184 self.assertRaises(TypeError, mock.child, 1)
2185 self.assertEqual(mock.mock_calls, [call.child(1, 2)])
2186 self.assertIn('mock.child', repr(mock.child.mock))
2187
2188 def test_parent_propagation_with_autospec_attach_mock(self):
2189
2190 def foo(a, b): pass
2191
2192 parent = Mock()
2193 parent.attach_mock(create_autospec(foo, name='bar'), 'child')
2194 parent.child(1, 2)
2195
2196 self.assertRaises(TypeError, parent.child, 1)
2197 self.assertEqual(parent.child.mock_calls, [call.child(1, 2)])
2198 self.assertIn('mock.child', repr(parent.child.mock))
2199
2200
2201 def test_isinstance_under_settrace(self):
2202 # bpo-36593 : __class__ is not set for a class that has __class__
2203 # property defined when it's used with sys.settrace(trace) set.
2204 # Delete the module to force reimport with tracing function set
2205 # restore the old reference later since there are other tests that are
2206 # dependent on unittest.mock.patch. In testpatch.PatchTest
2207 # test_patch_dict_test_prefix and test_patch_test_prefix not restoring
2208 # causes the objects patched to go out of sync
2209
2210 old_patch = unittest.mock.patch
2211
2212 # Directly using __setattr__ on unittest.mock causes current imported
2213 # reference to be updated. Use a lambda so that during cleanup the
2214 # re-imported new reference is updated.
2215 self.addCleanup(lambda patch: setattr(unittest.mock, 'patch', patch),
2216 old_patch)
2217
2218 with patch.dict('sys.modules'):
2219 del sys.modules['unittest.mock']
2220
2221 # This trace will stop coverage being measured ;-)
2222 def trace(frame, event, arg): # pragma: no cover
2223 return trace
2224
2225 self.addCleanup(sys.settrace, sys.gettrace())
2226 sys.settrace(trace)
2227
2228 from unittest.mock import (
2229 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
2230 )
2231
2232 mocks = [
2233 Mock, MagicMock, NonCallableMock, NonCallableMagicMock, AsyncMock
2234 ]
2235
2236 for mock in mocks:
2237 obj = mock(spec=Something)
2238 self.assertIsInstance(obj, Something)
2239
2240 def test_bool_not_called_when_passing_spec_arg(self):
2241 class ESC[4;38;5;81mSomething:
2242 def __init__(self):
2243 self.obj_with_bool_func = unittest.mock.MagicMock()
2244
2245 obj = Something()
2246 with unittest.mock.patch.object(obj, 'obj_with_bool_func', spec=object): pass
2247
2248 self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0)
2249
2250 def test_misspelled_arguments(self):
2251 class ESC[4;38;5;81mFoo():
2252 one = 'one'
2253 # patch, patch.object and create_autospec need to check for misspelled
2254 # arguments explicitly and throw a RuntimError if found.
2255 with self.assertRaises(RuntimeError):
2256 with patch(f'{__name__}.Something.meth', autospect=True): pass
2257 with self.assertRaises(RuntimeError):
2258 with patch.object(Foo, 'one', autospect=True): pass
2259 with self.assertRaises(RuntimeError):
2260 with patch(f'{__name__}.Something.meth', auto_spec=True): pass
2261 with self.assertRaises(RuntimeError):
2262 with patch.object(Foo, 'one', auto_spec=True): pass
2263 with self.assertRaises(RuntimeError):
2264 with patch(f'{__name__}.Something.meth', set_spec=True): pass
2265 with self.assertRaises(RuntimeError):
2266 with patch.object(Foo, 'one', set_spec=True): pass
2267 with self.assertRaises(RuntimeError):
2268 m = create_autospec(Foo, set_spec=True)
2269 # patch.multiple, on the other hand, should flag misspelled arguments
2270 # through an AttributeError, when trying to find the keys from kwargs
2271 # as attributes on the target.
2272 with self.assertRaises(AttributeError):
2273 with patch.multiple(
2274 f'{__name__}.Something', meth=DEFAULT, autospect=True): pass
2275 with self.assertRaises(AttributeError):
2276 with patch.multiple(
2277 f'{__name__}.Something', meth=DEFAULT, auto_spec=True): pass
2278 with self.assertRaises(AttributeError):
2279 with patch.multiple(
2280 f'{__name__}.Something', meth=DEFAULT, set_spec=True): pass
2281
2282 with patch(f'{__name__}.Something.meth', unsafe=True, autospect=True):
2283 pass
2284 with patch.object(Foo, 'one', unsafe=True, autospect=True): pass
2285 with patch(f'{__name__}.Something.meth', unsafe=True, auto_spec=True):
2286 pass
2287 with patch.object(Foo, 'one', unsafe=True, auto_spec=True): pass
2288 with patch(f'{__name__}.Something.meth', unsafe=True, set_spec=True):
2289 pass
2290 with patch.object(Foo, 'one', unsafe=True, set_spec=True): pass
2291 m = create_autospec(Foo, set_spec=True, unsafe=True)
2292 with patch.multiple(
2293 f'{__name__}.Typos', autospect=True, set_spec=True, auto_spec=True):
2294 pass
2295
2296
2297 if __name__ == '__main__':
2298 unittest.main()