blob: 016905c3b90e5cb54674db755de7f116423bae4d [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
Serhiy Storchaka662db122019-08-08 08:42:54 +03006from test.support import ALWAYS_EQ
Michael Foord345266a2012-03-14 12:24:34 -07007import unittest
8from unittest.test.testmock.support import is_instance
9from unittest import mock
10from unittest.mock import (
11 call, DEFAULT, patch, sentinel,
12 MagicMock, Mock, NonCallableMock,
Lisa Roach77b3b772019-05-20 09:19:53 -070013 NonCallableMagicMock, AsyncMock, _Call, _CallList,
Michael Foord345266a2012-03-14 12:24:34 -070014 create_autospec
15)
16
17
18class Iter(object):
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
Antoine Pitrou5c64df72013-02-03 00:23:58 +010031class Something(object):
Chris Withersadbf1782019-05-01 23:04:04 +010032 def meth(self, a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010033
34 @classmethod
Chris Withersadbf1782019-05-01 23:04:04 +010035 def cmeth(cls, a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010036
37 @staticmethod
Chris Withersadbf1782019-05-01 23:04:04 +010038 def smeth(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +010039
Michael Foord345266a2012-03-14 12:24:34 -070040
Xtreak7397cda2019-07-22 13:08:22 +053041def something(a): pass
42
43
Michael Foord345266a2012-03-14 12:24:34 -070044class MockTest(unittest.TestCase):
45
46 def test_all(self):
47 # if __all__ is badly defined then import * will raise an error
48 # We have to exec it because you can't import * inside a method
49 # in Python 3
Michael Foord83a16852012-03-14 12:58:46 -070050 exec("from unittest.mock import *")
Michael Foord345266a2012-03-14 12:24:34 -070051
52
53 def test_constructor(self):
54 mock = Mock()
55
56 self.assertFalse(mock.called, "called not initialised correctly")
57 self.assertEqual(mock.call_count, 0,
58 "call_count not initialised correctly")
59 self.assertTrue(is_instance(mock.return_value, Mock),
60 "return_value not initialised correctly")
61
62 self.assertEqual(mock.call_args, None,
63 "call_args not initialised correctly")
64 self.assertEqual(mock.call_args_list, [],
65 "call_args_list not initialised correctly")
66 self.assertEqual(mock.method_calls, [],
67 "method_calls not initialised correctly")
68
69 # Can't use hasattr for this test as it always returns True on a mock
Serhiy Storchaka5665bc52013-11-17 00:12:21 +020070 self.assertNotIn('_items', mock.__dict__,
Michael Foord345266a2012-03-14 12:24:34 -070071 "default mock should not have '_items' attribute")
72
73 self.assertIsNone(mock._mock_parent,
74 "parent not initialised correctly")
75 self.assertIsNone(mock._mock_methods,
76 "methods not initialised correctly")
77 self.assertEqual(mock._mock_children, {},
78 "children not initialised incorrectly")
79
80
81 def test_return_value_in_constructor(self):
82 mock = Mock(return_value=None)
83 self.assertIsNone(mock.return_value,
84 "return value in constructor not honoured")
85
86
Chris Withersadbf1782019-05-01 23:04:04 +010087 def test_change_return_value_via_delegate(self):
88 def f(): pass
89 mock = create_autospec(f)
90 mock.mock.return_value = 1
91 self.assertEqual(mock(), 1)
92
93
94 def test_change_side_effect_via_delegate(self):
95 def f(): pass
96 mock = create_autospec(f)
97 mock.mock.side_effect = TypeError()
98 with self.assertRaises(TypeError):
99 mock()
100
101
Michael Foord345266a2012-03-14 12:24:34 -0700102 def test_repr(self):
103 mock = Mock(name='foo')
104 self.assertIn('foo', repr(mock))
105 self.assertIn("'%s'" % id(mock), repr(mock))
106
107 mocks = [(Mock(), 'mock'), (Mock(name='bar'), 'bar')]
108 for mock, name in mocks:
109 self.assertIn('%s.bar' % name, repr(mock.bar))
110 self.assertIn('%s.foo()' % name, repr(mock.foo()))
111 self.assertIn('%s.foo().bing' % name, repr(mock.foo().bing))
112 self.assertIn('%s()' % name, repr(mock()))
113 self.assertIn('%s()()' % name, repr(mock()()))
114 self.assertIn('%s()().foo.bar.baz().bing' % name,
115 repr(mock()().foo.bar.baz().bing))
116
117
118 def test_repr_with_spec(self):
119 class X(object):
120 pass
121
122 mock = Mock(spec=X)
123 self.assertIn(" spec='X' ", repr(mock))
124
125 mock = Mock(spec=X())
126 self.assertIn(" spec='X' ", repr(mock))
127
128 mock = Mock(spec_set=X)
129 self.assertIn(" spec_set='X' ", repr(mock))
130
131 mock = Mock(spec_set=X())
132 self.assertIn(" spec_set='X' ", repr(mock))
133
134 mock = Mock(spec=X, name='foo')
135 self.assertIn(" spec='X' ", repr(mock))
136 self.assertIn(" name='foo' ", repr(mock))
137
138 mock = Mock(name='foo')
139 self.assertNotIn("spec", repr(mock))
140
141 mock = Mock()
142 self.assertNotIn("spec", repr(mock))
143
144 mock = Mock(spec=['foo'])
145 self.assertNotIn("spec", repr(mock))
146
147
148 def test_side_effect(self):
149 mock = Mock()
150
151 def effect(*args, **kwargs):
152 raise SystemError('kablooie')
153
154 mock.side_effect = effect
155 self.assertRaises(SystemError, mock, 1, 2, fish=3)
156 mock.assert_called_with(1, 2, fish=3)
157
158 results = [1, 2, 3]
159 def effect():
160 return results.pop()
161 mock.side_effect = effect
162
163 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
164 "side effect not used correctly")
165
166 mock = Mock(side_effect=sentinel.SideEffect)
167 self.assertEqual(mock.side_effect, sentinel.SideEffect,
168 "side effect in constructor not used")
169
170 def side_effect():
171 return DEFAULT
172 mock = Mock(side_effect=side_effect, return_value=sentinel.RETURN)
173 self.assertEqual(mock(), sentinel.RETURN)
174
Michael Foord01bafdc2014-04-14 16:09:42 -0400175 def test_autospec_side_effect(self):
176 # Test for issue17826
177 results = [1, 2, 3]
178 def effect():
179 return results.pop()
Chris Withersadbf1782019-05-01 23:04:04 +0100180 def f(): pass
Michael Foord01bafdc2014-04-14 16:09:42 -0400181
182 mock = create_autospec(f)
183 mock.side_effect = [1, 2, 3]
184 self.assertEqual([mock(), mock(), mock()], [1, 2, 3],
185 "side effect not used correctly in create_autospec")
186 # Test where side effect is a callable
187 results = [1, 2, 3]
188 mock = create_autospec(f)
189 mock.side_effect = effect
190 self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
191 "callable side effect not used correctly")
Michael Foord345266a2012-03-14 12:24:34 -0700192
Robert Collinsf58f88c2015-07-14 13:51:40 +1200193 def test_autospec_side_effect_exception(self):
194 # Test for issue 23661
Chris Withersadbf1782019-05-01 23:04:04 +0100195 def f(): pass
Robert Collinsf58f88c2015-07-14 13:51:40 +1200196
197 mock = create_autospec(f)
198 mock.side_effect = ValueError('Bazinga!')
199 self.assertRaisesRegex(ValueError, 'Bazinga!', mock)
200
Michael Foord345266a2012-03-14 12:24:34 -0700201
202 def test_reset_mock(self):
203 parent = Mock()
204 spec = ["something"]
205 mock = Mock(name="child", parent=parent, spec=spec)
206 mock(sentinel.Something, something=sentinel.SomethingElse)
207 something = mock.something
208 mock.something()
209 mock.side_effect = sentinel.SideEffect
210 return_value = mock.return_value
211 return_value()
212
213 mock.reset_mock()
214
215 self.assertEqual(mock._mock_name, "child",
216 "name incorrectly reset")
217 self.assertEqual(mock._mock_parent, parent,
218 "parent incorrectly reset")
219 self.assertEqual(mock._mock_methods, spec,
220 "methods incorrectly reset")
221
222 self.assertFalse(mock.called, "called not reset")
223 self.assertEqual(mock.call_count, 0, "call_count not reset")
224 self.assertEqual(mock.call_args, None, "call_args not reset")
225 self.assertEqual(mock.call_args_list, [], "call_args_list not reset")
226 self.assertEqual(mock.method_calls, [],
227 "method_calls not initialised correctly: %r != %r" %
228 (mock.method_calls, []))
229 self.assertEqual(mock.mock_calls, [])
230
231 self.assertEqual(mock.side_effect, sentinel.SideEffect,
232 "side_effect incorrectly reset")
233 self.assertEqual(mock.return_value, return_value,
234 "return_value incorrectly reset")
235 self.assertFalse(return_value.called, "return value mock not reset")
236 self.assertEqual(mock._mock_children, {'something': something},
237 "children reset incorrectly")
238 self.assertEqual(mock.something, something,
239 "children incorrectly cleared")
240 self.assertFalse(mock.something.called, "child not reset")
241
242
243 def test_reset_mock_recursion(self):
244 mock = Mock()
245 mock.return_value = mock
246
247 # used to cause recursion
248 mock.reset_mock()
249
Robert Collinsb37f43f2015-07-15 11:42:28 +1200250 def test_reset_mock_on_mock_open_issue_18622(self):
251 a = mock.mock_open()
252 a.reset_mock()
Michael Foord345266a2012-03-14 12:24:34 -0700253
254 def test_call(self):
255 mock = Mock()
256 self.assertTrue(is_instance(mock.return_value, Mock),
257 "Default return_value should be a Mock")
258
259 result = mock()
260 self.assertEqual(mock(), result,
261 "different result from consecutive calls")
262 mock.reset_mock()
263
264 ret_val = mock(sentinel.Arg)
265 self.assertTrue(mock.called, "called not set")
Min ho Kimc4cacc82019-07-31 08:16:13 +1000266 self.assertEqual(mock.call_count, 1, "call_count incorrect")
Michael Foord345266a2012-03-14 12:24:34 -0700267 self.assertEqual(mock.call_args, ((sentinel.Arg,), {}),
268 "call_args not set")
Kumar Akshayb0df45e2019-03-22 13:40:40 +0530269 self.assertEqual(mock.call_args.args, (sentinel.Arg,),
270 "call_args not set")
271 self.assertEqual(mock.call_args.kwargs, {},
272 "call_args not set")
Michael Foord345266a2012-03-14 12:24:34 -0700273 self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})],
274 "call_args_list not initialised correctly")
275
276 mock.return_value = sentinel.ReturnValue
277 ret_val = mock(sentinel.Arg, key=sentinel.KeyArg)
278 self.assertEqual(ret_val, sentinel.ReturnValue,
279 "incorrect return value")
280
281 self.assertEqual(mock.call_count, 2, "call_count incorrect")
282 self.assertEqual(mock.call_args,
283 ((sentinel.Arg,), {'key': sentinel.KeyArg}),
284 "call_args not set")
285 self.assertEqual(mock.call_args_list, [
286 ((sentinel.Arg,), {}),
287 ((sentinel.Arg,), {'key': sentinel.KeyArg})
288 ],
289 "call_args_list not set")
290
291
292 def test_call_args_comparison(self):
293 mock = Mock()
294 mock()
295 mock(sentinel.Arg)
296 mock(kw=sentinel.Kwarg)
297 mock(sentinel.Arg, kw=sentinel.Kwarg)
298 self.assertEqual(mock.call_args_list, [
299 (),
300 ((sentinel.Arg,),),
301 ({"kw": sentinel.Kwarg},),
302 ((sentinel.Arg,), {"kw": sentinel.Kwarg})
303 ])
304 self.assertEqual(mock.call_args,
305 ((sentinel.Arg,), {"kw": sentinel.Kwarg}))
Kumar Akshayb0df45e2019-03-22 13:40:40 +0530306 self.assertEqual(mock.call_args.args, (sentinel.Arg,))
307 self.assertEqual(mock.call_args.kwargs, {"kw": sentinel.Kwarg})
Michael Foord345266a2012-03-14 12:24:34 -0700308
Berker Peksag3fc536f2015-09-09 23:35:25 +0300309 # Comparing call_args to a long sequence should not raise
310 # an exception. See issue 24857.
311 self.assertFalse(mock.call_args == "a long sequence")
Michael Foord345266a2012-03-14 12:24:34 -0700312
Berker Peksagce913872016-03-28 00:30:02 +0300313
314 def test_calls_equal_with_any(self):
Berker Peksagce913872016-03-28 00:30:02 +0300315 # Check that equality and non-equality is consistent even when
316 # comparing with mock.ANY
Serhiy Storchaka362f0582017-01-21 23:12:58 +0200317 mm = mock.MagicMock()
318 self.assertTrue(mm == mm)
319 self.assertFalse(mm != mm)
320 self.assertFalse(mm == mock.MagicMock())
321 self.assertTrue(mm != mock.MagicMock())
322 self.assertTrue(mm == mock.ANY)
323 self.assertFalse(mm != mock.ANY)
324 self.assertTrue(mock.ANY == mm)
325 self.assertFalse(mock.ANY != mm)
Serhiy Storchaka662db122019-08-08 08:42:54 +0300326 self.assertTrue(mm == ALWAYS_EQ)
327 self.assertFalse(mm != ALWAYS_EQ)
Serhiy Storchaka362f0582017-01-21 23:12:58 +0200328
329 call1 = mock.call(mock.MagicMock())
330 call2 = mock.call(mock.ANY)
Berker Peksagce913872016-03-28 00:30:02 +0300331 self.assertTrue(call1 == call2)
332 self.assertFalse(call1 != call2)
Serhiy Storchaka362f0582017-01-21 23:12:58 +0200333 self.assertTrue(call2 == call1)
334 self.assertFalse(call2 != call1)
Berker Peksagce913872016-03-28 00:30:02 +0300335
Serhiy Storchaka662db122019-08-08 08:42:54 +0300336 self.assertTrue(call1 == ALWAYS_EQ)
337 self.assertFalse(call1 != ALWAYS_EQ)
338 self.assertFalse(call1 == 1)
339 self.assertTrue(call1 != 1)
340
Berker Peksagce913872016-03-28 00:30:02 +0300341
Michael Foord345266a2012-03-14 12:24:34 -0700342 def test_assert_called_with(self):
343 mock = Mock()
344 mock()
345
346 # Will raise an exception if it fails
347 mock.assert_called_with()
348 self.assertRaises(AssertionError, mock.assert_called_with, 1)
349
350 mock.reset_mock()
351 self.assertRaises(AssertionError, mock.assert_called_with)
352
353 mock(1, 2, 3, a='fish', b='nothing')
354 mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
355
356
Berker Peksagce913872016-03-28 00:30:02 +0300357 def test_assert_called_with_any(self):
358 m = MagicMock()
359 m(MagicMock())
360 m.assert_called_with(mock.ANY)
361
362
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100363 def test_assert_called_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +0100364 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100365
366 mock = Mock(spec=f)
367
368 mock(1, b=2, c=3)
369 mock.assert_called_with(1, 2, 3)
370 mock.assert_called_with(a=1, b=2, c=3)
371 self.assertRaises(AssertionError, mock.assert_called_with,
372 1, b=3, c=2)
373 # Expected call doesn't match the spec's signature
374 with self.assertRaises(AssertionError) as cm:
375 mock.assert_called_with(e=8)
376 self.assertIsInstance(cm.exception.__cause__, TypeError)
377
378
379 def test_assert_called_with_method_spec(self):
380 def _check(mock):
381 mock(1, b=2, c=3)
382 mock.assert_called_with(1, 2, 3)
383 mock.assert_called_with(a=1, b=2, c=3)
384 self.assertRaises(AssertionError, mock.assert_called_with,
385 1, b=3, c=2)
386
387 mock = Mock(spec=Something().meth)
388 _check(mock)
389 mock = Mock(spec=Something.cmeth)
390 _check(mock)
391 mock = Mock(spec=Something().cmeth)
392 _check(mock)
393 mock = Mock(spec=Something.smeth)
394 _check(mock)
395 mock = Mock(spec=Something().smeth)
396 _check(mock)
397
398
Abraham Toriz Cruz5f5f11f2019-09-17 06:16:08 -0500399 def test_assert_called_exception_message(self):
400 msg = "Expected '{0}' to have been called"
401 with self.assertRaisesRegex(AssertionError, msg.format('mock')):
402 Mock().assert_called()
403 with self.assertRaisesRegex(AssertionError, msg.format('test_name')):
404 Mock(name="test_name").assert_called()
405
406
Michael Foord345266a2012-03-14 12:24:34 -0700407 def test_assert_called_once_with(self):
408 mock = Mock()
409 mock()
410
411 # Will raise an exception if it fails
412 mock.assert_called_once_with()
413
414 mock()
415 self.assertRaises(AssertionError, mock.assert_called_once_with)
416
417 mock.reset_mock()
418 self.assertRaises(AssertionError, mock.assert_called_once_with)
419
420 mock('foo', 'bar', baz=2)
421 mock.assert_called_once_with('foo', 'bar', baz=2)
422
423 mock.reset_mock()
424 mock('foo', 'bar', baz=2)
425 self.assertRaises(
426 AssertionError,
427 lambda: mock.assert_called_once_with('bob', 'bar', baz=2)
428 )
429
Petter Strandmark47d94242018-10-28 21:37:10 +0100430 def test_assert_called_once_with_call_list(self):
431 m = Mock()
432 m(1)
433 m(2)
434 self.assertRaisesRegex(AssertionError,
435 re.escape("Calls: [call(1), call(2)]"),
436 lambda: m.assert_called_once_with(2))
437
Michael Foord345266a2012-03-14 12:24:34 -0700438
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100439 def test_assert_called_once_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +0100440 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100441
442 mock = Mock(spec=f)
443
444 mock(1, b=2, c=3)
445 mock.assert_called_once_with(1, 2, 3)
446 mock.assert_called_once_with(a=1, b=2, c=3)
447 self.assertRaises(AssertionError, mock.assert_called_once_with,
448 1, b=3, c=2)
449 # Expected call doesn't match the spec's signature
450 with self.assertRaises(AssertionError) as cm:
451 mock.assert_called_once_with(e=8)
452 self.assertIsInstance(cm.exception.__cause__, TypeError)
453 # Mock called more than once => always fails
454 mock(4, 5, 6)
455 self.assertRaises(AssertionError, mock.assert_called_once_with,
456 1, 2, 3)
457 self.assertRaises(AssertionError, mock.assert_called_once_with,
458 4, 5, 6)
459
460
Michael Foord345266a2012-03-14 12:24:34 -0700461 def test_attribute_access_returns_mocks(self):
462 mock = Mock()
463 something = mock.something
464 self.assertTrue(is_instance(something, Mock), "attribute isn't a mock")
465 self.assertEqual(mock.something, something,
466 "different attributes returned for same name")
467
468 # Usage example
469 mock = Mock()
470 mock.something.return_value = 3
471
472 self.assertEqual(mock.something(), 3, "method returned wrong value")
473 self.assertTrue(mock.something.called,
474 "method didn't record being called")
475
476
477 def test_attributes_have_name_and_parent_set(self):
478 mock = Mock()
479 something = mock.something
480
481 self.assertEqual(something._mock_name, "something",
482 "attribute name not set correctly")
483 self.assertEqual(something._mock_parent, mock,
484 "attribute parent not set correctly")
485
486
487 def test_method_calls_recorded(self):
488 mock = Mock()
489 mock.something(3, fish=None)
490 mock.something_else.something(6, cake=sentinel.Cake)
491
492 self.assertEqual(mock.something_else.method_calls,
493 [("something", (6,), {'cake': sentinel.Cake})],
494 "method calls not recorded correctly")
495 self.assertEqual(mock.method_calls, [
496 ("something", (3,), {'fish': None}),
497 ("something_else.something", (6,), {'cake': sentinel.Cake})
498 ],
499 "method calls not recorded correctly")
500
501
502 def test_method_calls_compare_easily(self):
503 mock = Mock()
504 mock.something()
505 self.assertEqual(mock.method_calls, [('something',)])
506 self.assertEqual(mock.method_calls, [('something', (), {})])
507
508 mock = Mock()
509 mock.something('different')
510 self.assertEqual(mock.method_calls, [('something', ('different',))])
511 self.assertEqual(mock.method_calls,
512 [('something', ('different',), {})])
513
514 mock = Mock()
515 mock.something(x=1)
516 self.assertEqual(mock.method_calls, [('something', {'x': 1})])
517 self.assertEqual(mock.method_calls, [('something', (), {'x': 1})])
518
519 mock = Mock()
520 mock.something('different', some='more')
521 self.assertEqual(mock.method_calls, [
522 ('something', ('different',), {'some': 'more'})
523 ])
524
525
526 def test_only_allowed_methods_exist(self):
527 for spec in ['something'], ('something',):
528 for arg in 'spec', 'spec_set':
529 mock = Mock(**{arg: spec})
530
531 # this should be allowed
532 mock.something
533 self.assertRaisesRegex(
534 AttributeError,
535 "Mock object has no attribute 'something_else'",
536 getattr, mock, 'something_else'
537 )
538
539
540 def test_from_spec(self):
541 class Something(object):
542 x = 3
543 __something__ = None
Chris Withersadbf1782019-05-01 23:04:04 +0100544 def y(self): pass
Michael Foord345266a2012-03-14 12:24:34 -0700545
546 def test_attributes(mock):
547 # should work
548 mock.x
549 mock.y
550 mock.__something__
551 self.assertRaisesRegex(
552 AttributeError,
553 "Mock object has no attribute 'z'",
554 getattr, mock, 'z'
555 )
556 self.assertRaisesRegex(
557 AttributeError,
558 "Mock object has no attribute '__foobar__'",
559 getattr, mock, '__foobar__'
560 )
561
562 test_attributes(Mock(spec=Something))
563 test_attributes(Mock(spec=Something()))
564
565
566 def test_wraps_calls(self):
567 real = Mock()
568
569 mock = Mock(wraps=real)
570 self.assertEqual(mock(), real())
571
572 real.reset_mock()
573
574 mock(1, 2, fish=3)
575 real.assert_called_with(1, 2, fish=3)
576
577
Mario Corcherof05df0a2018-12-08 11:25:02 +0000578 def test_wraps_prevents_automatic_creation_of_mocks(self):
579 class Real(object):
580 pass
581
582 real = Real()
583 mock = Mock(wraps=real)
584
585 self.assertRaises(AttributeError, lambda: mock.new_attr())
586
587
Michael Foord345266a2012-03-14 12:24:34 -0700588 def test_wraps_call_with_nondefault_return_value(self):
589 real = Mock()
590
591 mock = Mock(wraps=real)
592 mock.return_value = 3
593
594 self.assertEqual(mock(), 3)
595 self.assertFalse(real.called)
596
597
598 def test_wraps_attributes(self):
599 class Real(object):
600 attribute = Mock()
601
602 real = Real()
603
604 mock = Mock(wraps=real)
605 self.assertEqual(mock.attribute(), real.attribute())
606 self.assertRaises(AttributeError, lambda: mock.fish)
607
608 self.assertNotEqual(mock.attribute, real.attribute)
609 result = mock.attribute.frog(1, 2, fish=3)
610 Real.attribute.frog.assert_called_with(1, 2, fish=3)
611 self.assertEqual(result, Real.attribute.frog())
612
613
Mario Corcherof05df0a2018-12-08 11:25:02 +0000614 def test_customize_wrapped_object_with_side_effect_iterable_with_default(self):
615 class Real(object):
616 def method(self):
617 return sentinel.ORIGINAL_VALUE
618
619 real = Real()
620 mock = Mock(wraps=real)
621 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
622
623 self.assertEqual(mock.method(), sentinel.VALUE1)
624 self.assertEqual(mock.method(), sentinel.ORIGINAL_VALUE)
625 self.assertRaises(StopIteration, mock.method)
626
627
628 def test_customize_wrapped_object_with_side_effect_iterable(self):
629 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100630 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000631
632 real = Real()
633 mock = Mock(wraps=real)
634 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
635
636 self.assertEqual(mock.method(), sentinel.VALUE1)
637 self.assertEqual(mock.method(), sentinel.VALUE2)
638 self.assertRaises(StopIteration, mock.method)
639
640
641 def test_customize_wrapped_object_with_side_effect_exception(self):
642 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100643 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000644
645 real = Real()
646 mock = Mock(wraps=real)
647 mock.method.side_effect = RuntimeError
648
649 self.assertRaises(RuntimeError, mock.method)
650
651
652 def test_customize_wrapped_object_with_side_effect_function(self):
653 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100654 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000655 def side_effect():
656 return sentinel.VALUE
657
658 real = Real()
659 mock = Mock(wraps=real)
660 mock.method.side_effect = side_effect
661
662 self.assertEqual(mock.method(), sentinel.VALUE)
663
664
665 def test_customize_wrapped_object_with_return_value(self):
666 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100667 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000668
669 real = Real()
670 mock = Mock(wraps=real)
671 mock.method.return_value = sentinel.VALUE
672
673 self.assertEqual(mock.method(), sentinel.VALUE)
674
675
676 def test_customize_wrapped_object_with_return_value_and_side_effect(self):
677 # side_effect should always take precedence over return_value.
678 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100679 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000680
681 real = Real()
682 mock = Mock(wraps=real)
683 mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2]
684 mock.method.return_value = sentinel.WRONG_VALUE
685
686 self.assertEqual(mock.method(), sentinel.VALUE1)
687 self.assertEqual(mock.method(), sentinel.VALUE2)
688 self.assertRaises(StopIteration, mock.method)
689
690
691 def test_customize_wrapped_object_with_return_value_and_side_effect2(self):
692 # side_effect can return DEFAULT to default to return_value
693 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100694 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000695
696 real = Real()
697 mock = Mock(wraps=real)
698 mock.method.side_effect = lambda: DEFAULT
699 mock.method.return_value = sentinel.VALUE
700
701 self.assertEqual(mock.method(), sentinel.VALUE)
702
703
704 def test_customize_wrapped_object_with_return_value_and_side_effect_default(self):
705 class Real(object):
Chris Withersadbf1782019-05-01 23:04:04 +0100706 def method(self): pass
Mario Corcherof05df0a2018-12-08 11:25:02 +0000707
708 real = Real()
709 mock = Mock(wraps=real)
710 mock.method.side_effect = [sentinel.VALUE1, DEFAULT]
711 mock.method.return_value = sentinel.RETURN
712
713 self.assertEqual(mock.method(), sentinel.VALUE1)
714 self.assertEqual(mock.method(), sentinel.RETURN)
715 self.assertRaises(StopIteration, mock.method)
716
717
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530718 def test_magic_method_wraps_dict(self):
Karthikeyan Singaravelan521c8d62020-04-29 00:52:31 +0530719 # bpo-25597: MagicMock with wrap doesn't call wrapped object's
720 # method for magic methods with default values.
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530721 data = {'foo': 'bar'}
722
723 wrapped_dict = MagicMock(wraps=data)
724 self.assertEqual(wrapped_dict.get('foo'), 'bar')
Karthikeyan Singaravelan521c8d62020-04-29 00:52:31 +0530725 # Accessing key gives a MagicMock
726 self.assertIsInstance(wrapped_dict['foo'], MagicMock)
727 # __contains__ method has a default value of False
728 self.assertFalse('foo' in wrapped_dict)
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530729
730 # return_value is non-sentinel and takes precedence over wrapped value.
731 wrapped_dict.get.return_value = 'return_value'
732 self.assertEqual(wrapped_dict.get('foo'), 'return_value')
733
734 # return_value is sentinel and hence wrapped value is returned.
735 wrapped_dict.get.return_value = sentinel.DEFAULT
736 self.assertEqual(wrapped_dict.get('foo'), 'bar')
737
738 self.assertEqual(wrapped_dict.get('baz'), None)
Karthikeyan Singaravelan521c8d62020-04-29 00:52:31 +0530739 self.assertIsInstance(wrapped_dict['baz'], MagicMock)
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530740 self.assertFalse('bar' in wrapped_dict)
741
742 data['baz'] = 'spam'
743 self.assertEqual(wrapped_dict.get('baz'), 'spam')
Karthikeyan Singaravelan521c8d62020-04-29 00:52:31 +0530744 self.assertIsInstance(wrapped_dict['baz'], MagicMock)
745 self.assertFalse('bar' in wrapped_dict)
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530746
747 del data['baz']
748 self.assertEqual(wrapped_dict.get('baz'), None)
749
750
751 def test_magic_method_wraps_class(self):
752
753 class Foo:
754
755 def __getitem__(self, index):
756 return index
757
758 def __custom_method__(self):
759 return "foo"
760
761
762 klass = MagicMock(wraps=Foo)
763 obj = klass()
764 self.assertEqual(obj.__getitem__(2), 2)
Karthikeyan Singaravelan521c8d62020-04-29 00:52:31 +0530765 self.assertEqual(obj[2], 2)
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +0530766 self.assertEqual(obj.__custom_method__(), "foo")
767
768
Michael Foord345266a2012-03-14 12:24:34 -0700769 def test_exceptional_side_effect(self):
770 mock = Mock(side_effect=AttributeError)
771 self.assertRaises(AttributeError, mock)
772
773 mock = Mock(side_effect=AttributeError('foo'))
774 self.assertRaises(AttributeError, mock)
775
776
777 def test_baseexceptional_side_effect(self):
778 mock = Mock(side_effect=KeyboardInterrupt)
779 self.assertRaises(KeyboardInterrupt, mock)
780
781 mock = Mock(side_effect=KeyboardInterrupt('foo'))
782 self.assertRaises(KeyboardInterrupt, mock)
783
784
785 def test_assert_called_with_message(self):
786 mock = Mock()
Susan Su2bdd5852019-02-13 18:22:29 -0800787 self.assertRaisesRegex(AssertionError, 'not called',
Michael Foord345266a2012-03-14 12:24:34 -0700788 mock.assert_called_with)
789
790
Michael Foord28d591c2012-09-28 16:15:22 +0100791 def test_assert_called_once_with_message(self):
792 mock = Mock(name='geoffrey')
793 self.assertRaisesRegex(AssertionError,
794 r"Expected 'geoffrey' to be called once\.",
795 mock.assert_called_once_with)
796
797
Michael Foord345266a2012-03-14 12:24:34 -0700798 def test__name__(self):
799 mock = Mock()
800 self.assertRaises(AttributeError, lambda: mock.__name__)
801
802 mock.__name__ = 'foo'
803 self.assertEqual(mock.__name__, 'foo')
804
805
806 def test_spec_list_subclass(self):
807 class Sub(list):
808 pass
809 mock = Mock(spec=Sub(['foo']))
810
811 mock.append(3)
812 mock.append.assert_called_with(3)
813 self.assertRaises(AttributeError, getattr, mock, 'foo')
814
815
816 def test_spec_class(self):
817 class X(object):
818 pass
819
820 mock = Mock(spec=X)
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200821 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700822
823 mock = Mock(spec=X())
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200824 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700825
826 self.assertIs(mock.__class__, X)
827 self.assertEqual(Mock().__class__.__name__, 'Mock')
828
829 mock = Mock(spec_set=X)
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200830 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700831
832 mock = Mock(spec_set=X())
Serhiy Storchaka5665bc52013-11-17 00:12:21 +0200833 self.assertIsInstance(mock, X)
Michael Foord345266a2012-03-14 12:24:34 -0700834
835
Chris Withersadbf1782019-05-01 23:04:04 +0100836 def test_spec_class_no_object_base(self):
837 class X:
838 pass
839
840 mock = Mock(spec=X)
841 self.assertIsInstance(mock, X)
842
843 mock = Mock(spec=X())
844 self.assertIsInstance(mock, X)
845
846 self.assertIs(mock.__class__, X)
847 self.assertEqual(Mock().__class__.__name__, 'Mock')
848
849 mock = Mock(spec_set=X)
850 self.assertIsInstance(mock, X)
851
852 mock = Mock(spec_set=X())
853 self.assertIsInstance(mock, X)
854
855
Michael Foord345266a2012-03-14 12:24:34 -0700856 def test_setting_attribute_with_spec_set(self):
857 class X(object):
858 y = 3
859
860 mock = Mock(spec=X)
861 mock.x = 'foo'
862
863 mock = Mock(spec_set=X)
864 def set_attr():
865 mock.x = 'foo'
866
867 mock.y = 'foo'
868 self.assertRaises(AttributeError, set_attr)
869
870
871 def test_copy(self):
872 current = sys.getrecursionlimit()
873 self.addCleanup(sys.setrecursionlimit, current)
874
875 # can't use sys.maxint as this doesn't exist in Python 3
876 sys.setrecursionlimit(int(10e8))
877 # this segfaults without the fix in place
878 copy.copy(Mock())
879
880
881 def test_subclass_with_properties(self):
882 class SubClass(Mock):
883 def _get(self):
884 return 3
885 def _set(self, value):
886 raise NameError('strange error')
887 some_attribute = property(_get, _set)
888
889 s = SubClass(spec_set=SubClass)
890 self.assertEqual(s.some_attribute, 3)
891
892 def test():
893 s.some_attribute = 3
894 self.assertRaises(NameError, test)
895
896 def test():
897 s.foo = 'bar'
898 self.assertRaises(AttributeError, test)
899
900
901 def test_setting_call(self):
902 mock = Mock()
903 def __call__(self, a):
Lisa Roachef048512019-09-23 20:49:40 -0700904 self._increment_mock_call(a)
Michael Foord345266a2012-03-14 12:24:34 -0700905 return self._mock_call(a)
906
907 type(mock).__call__ = __call__
908 mock('one')
909 mock.assert_called_with('one')
910
911 self.assertRaises(TypeError, mock, 'one', 'two')
912
913
914 def test_dir(self):
915 mock = Mock()
916 attrs = set(dir(mock))
917 type_attrs = set([m for m in dir(Mock) if not m.startswith('_')])
918
919 # all public attributes from the type are included
920 self.assertEqual(set(), type_attrs - attrs)
921
922 # creates these attributes
923 mock.a, mock.b
924 self.assertIn('a', dir(mock))
925 self.assertIn('b', dir(mock))
926
927 # instance attributes
928 mock.c = mock.d = None
929 self.assertIn('c', dir(mock))
930 self.assertIn('d', dir(mock))
931
932 # magic methods
933 mock.__iter__ = lambda s: iter([])
934 self.assertIn('__iter__', dir(mock))
935
936
937 def test_dir_from_spec(self):
938 mock = Mock(spec=unittest.TestCase)
939 testcase_attrs = set(dir(unittest.TestCase))
940 attrs = set(dir(mock))
941
942 # all attributes from the spec are included
943 self.assertEqual(set(), testcase_attrs - attrs)
944
945 # shadow a sys attribute
946 mock.version = 3
947 self.assertEqual(dir(mock).count('version'), 1)
948
949
950 def test_filter_dir(self):
951 patcher = patch.object(mock, 'FILTER_DIR', False)
952 patcher.start()
953 try:
954 attrs = set(dir(Mock()))
955 type_attrs = set(dir(Mock))
956
957 # ALL attributes from the type are included
958 self.assertEqual(set(), type_attrs - attrs)
959 finally:
960 patcher.stop()
961
962
Mario Corchero0df635c2019-04-30 19:56:36 +0100963 def test_dir_does_not_include_deleted_attributes(self):
964 mock = Mock()
965 mock.child.return_value = 1
966
967 self.assertIn('child', dir(mock))
968 del mock.child
969 self.assertNotIn('child', dir(mock))
970
971
Michael Foord345266a2012-03-14 12:24:34 -0700972 def test_configure_mock(self):
973 mock = Mock(foo='bar')
974 self.assertEqual(mock.foo, 'bar')
975
976 mock = MagicMock(foo='bar')
977 self.assertEqual(mock.foo, 'bar')
978
979 kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
980 'foo': MagicMock()}
981 mock = Mock(**kwargs)
982 self.assertRaises(KeyError, mock)
983 self.assertEqual(mock.foo.bar(), 33)
984 self.assertIsInstance(mock.foo, MagicMock)
985
986 mock = Mock()
987 mock.configure_mock(**kwargs)
988 self.assertRaises(KeyError, mock)
989 self.assertEqual(mock.foo.bar(), 33)
990 self.assertIsInstance(mock.foo, MagicMock)
991
992
993 def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs):
994 # needed because assertRaisesRegex doesn't work easily with newlines
Chris Withersadbf1782019-05-01 23:04:04 +0100995 with self.assertRaises(exception) as context:
Michael Foord345266a2012-03-14 12:24:34 -0700996 func(*args, **kwargs)
Chris Withersadbf1782019-05-01 23:04:04 +0100997 msg = str(context.exception)
Michael Foord345266a2012-03-14 12:24:34 -0700998 self.assertEqual(msg, message)
999
1000
1001 def test_assert_called_with_failure_message(self):
1002 mock = NonCallableMock()
1003
Susan Su2bdd5852019-02-13 18:22:29 -08001004 actual = 'not called.'
Michael Foord345266a2012-03-14 12:24:34 -07001005 expected = "mock(1, '2', 3, bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -08001006 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -07001007 self.assertRaisesWithMsg(
Susan Su2bdd5852019-02-13 18:22:29 -08001008 AssertionError, message % (expected, actual),
Michael Foord345266a2012-03-14 12:24:34 -07001009 mock.assert_called_with, 1, '2', 3, bar='foo'
1010 )
1011
1012 mock.foo(1, '2', 3, foo='foo')
1013
1014
1015 asserters = [
1016 mock.foo.assert_called_with, mock.foo.assert_called_once_with
1017 ]
1018 for meth in asserters:
1019 actual = "foo(1, '2', 3, foo='foo')"
1020 expected = "foo(1, '2', 3, bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -08001021 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -07001022 self.assertRaisesWithMsg(
1023 AssertionError, message % (expected, actual),
1024 meth, 1, '2', 3, bar='foo'
1025 )
1026
1027 # just kwargs
1028 for meth in asserters:
1029 actual = "foo(1, '2', 3, foo='foo')"
1030 expected = "foo(bar='foo')"
Susan Su2bdd5852019-02-13 18:22:29 -08001031 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -07001032 self.assertRaisesWithMsg(
1033 AssertionError, message % (expected, actual),
1034 meth, bar='foo'
1035 )
1036
1037 # just args
1038 for meth in asserters:
1039 actual = "foo(1, '2', 3, foo='foo')"
1040 expected = "foo(1, 2, 3)"
Susan Su2bdd5852019-02-13 18:22:29 -08001041 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -07001042 self.assertRaisesWithMsg(
1043 AssertionError, message % (expected, actual),
1044 meth, 1, 2, 3
1045 )
1046
1047 # empty
1048 for meth in asserters:
1049 actual = "foo(1, '2', 3, foo='foo')"
1050 expected = "foo()"
Susan Su2bdd5852019-02-13 18:22:29 -08001051 message = 'expected call not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -07001052 self.assertRaisesWithMsg(
1053 AssertionError, message % (expected, actual), meth
1054 )
1055
1056
1057 def test_mock_calls(self):
1058 mock = MagicMock()
1059
1060 # need to do this because MagicMock.mock_calls used to just return
1061 # a MagicMock which also returned a MagicMock when __eq__ was called
1062 self.assertIs(mock.mock_calls == [], True)
1063
1064 mock = MagicMock()
1065 mock()
1066 expected = [('', (), {})]
1067 self.assertEqual(mock.mock_calls, expected)
1068
1069 mock.foo()
1070 expected.append(call.foo())
1071 self.assertEqual(mock.mock_calls, expected)
1072 # intermediate mock_calls work too
1073 self.assertEqual(mock.foo.mock_calls, [('', (), {})])
1074
1075 mock = MagicMock()
1076 mock().foo(1, 2, 3, a=4, b=5)
1077 expected = [
1078 ('', (), {}), ('().foo', (1, 2, 3), dict(a=4, b=5))
1079 ]
1080 self.assertEqual(mock.mock_calls, expected)
1081 self.assertEqual(mock.return_value.foo.mock_calls,
1082 [('', (1, 2, 3), dict(a=4, b=5))])
1083 self.assertEqual(mock.return_value.mock_calls,
1084 [('foo', (1, 2, 3), dict(a=4, b=5))])
1085
1086 mock = MagicMock()
1087 mock().foo.bar().baz()
1088 expected = [
1089 ('', (), {}), ('().foo.bar', (), {}),
1090 ('().foo.bar().baz', (), {})
1091 ]
1092 self.assertEqual(mock.mock_calls, expected)
1093 self.assertEqual(mock().mock_calls,
1094 call.foo.bar().baz().call_list())
1095
1096 for kwargs in dict(), dict(name='bar'):
1097 mock = MagicMock(**kwargs)
1098 int(mock.foo)
1099 expected = [('foo.__int__', (), {})]
1100 self.assertEqual(mock.mock_calls, expected)
1101
1102 mock = MagicMock(**kwargs)
1103 mock.a()()
1104 expected = [('a', (), {}), ('a()', (), {})]
1105 self.assertEqual(mock.mock_calls, expected)
1106 self.assertEqual(mock.a().mock_calls, [call()])
1107
1108 mock = MagicMock(**kwargs)
1109 mock(1)(2)(3)
1110 self.assertEqual(mock.mock_calls, call(1)(2)(3).call_list())
1111 self.assertEqual(mock().mock_calls, call(2)(3).call_list())
1112 self.assertEqual(mock()().mock_calls, call(3).call_list())
1113
1114 mock = MagicMock(**kwargs)
1115 mock(1)(2)(3).a.b.c(4)
1116 self.assertEqual(mock.mock_calls,
1117 call(1)(2)(3).a.b.c(4).call_list())
1118 self.assertEqual(mock().mock_calls,
1119 call(2)(3).a.b.c(4).call_list())
1120 self.assertEqual(mock()().mock_calls,
1121 call(3).a.b.c(4).call_list())
1122
1123 mock = MagicMock(**kwargs)
1124 int(mock().foo.bar().baz())
1125 last_call = ('().foo.bar().baz().__int__', (), {})
1126 self.assertEqual(mock.mock_calls[-1], last_call)
1127 self.assertEqual(mock().mock_calls,
1128 call.foo.bar().baz().__int__().call_list())
1129 self.assertEqual(mock().foo.bar().mock_calls,
1130 call.baz().__int__().call_list())
1131 self.assertEqual(mock().foo.bar().baz.mock_calls,
1132 call().__int__().call_list())
1133
1134
Chris Withers8ca0fa92018-12-03 21:31:37 +00001135 def test_child_mock_call_equal(self):
1136 m = Mock()
1137 result = m()
1138 result.wibble()
1139 # parent looks like this:
1140 self.assertEqual(m.mock_calls, [call(), call().wibble()])
1141 # but child should look like this:
1142 self.assertEqual(result.mock_calls, [call.wibble()])
1143
1144
1145 def test_mock_call_not_equal_leaf(self):
1146 m = Mock()
1147 m.foo().something()
1148 self.assertNotEqual(m.mock_calls[1], call.foo().different())
1149 self.assertEqual(m.mock_calls[0], call.foo())
1150
1151
1152 def test_mock_call_not_equal_non_leaf(self):
1153 m = Mock()
1154 m.foo().bar()
1155 self.assertNotEqual(m.mock_calls[1], call.baz().bar())
1156 self.assertNotEqual(m.mock_calls[0], call.baz())
1157
1158
1159 def test_mock_call_not_equal_non_leaf_params_different(self):
1160 m = Mock()
1161 m.foo(x=1).bar()
1162 # This isn't ideal, but there's no way to fix it without breaking backwards compatibility:
1163 self.assertEqual(m.mock_calls[1], call.foo(x=2).bar())
1164
1165
1166 def test_mock_call_not_equal_non_leaf_attr(self):
1167 m = Mock()
1168 m.foo.bar()
1169 self.assertNotEqual(m.mock_calls[0], call.baz.bar())
1170
1171
1172 def test_mock_call_not_equal_non_leaf_call_versus_attr(self):
1173 m = Mock()
1174 m.foo.bar()
1175 self.assertNotEqual(m.mock_calls[0], call.foo().bar())
1176
1177
1178 def test_mock_call_repr(self):
1179 m = Mock()
1180 m.foo().bar().baz.bob()
1181 self.assertEqual(repr(m.mock_calls[0]), 'call.foo()')
1182 self.assertEqual(repr(m.mock_calls[1]), 'call.foo().bar()')
1183 self.assertEqual(repr(m.mock_calls[2]), 'call.foo().bar().baz.bob()')
1184
1185
Chris Withersadbf1782019-05-01 23:04:04 +01001186 def test_mock_call_repr_loop(self):
1187 m = Mock()
1188 m.foo = m
1189 repr(m.foo())
1190 self.assertRegex(repr(m.foo()), r"<Mock name='mock\(\)' id='\d+'>")
1191
1192
1193 def test_mock_calls_contains(self):
1194 m = Mock()
1195 self.assertFalse([call()] in m.mock_calls)
1196
1197
Michael Foord345266a2012-03-14 12:24:34 -07001198 def test_subclassing(self):
1199 class Subclass(Mock):
1200 pass
1201
1202 mock = Subclass()
1203 self.assertIsInstance(mock.foo, Subclass)
1204 self.assertIsInstance(mock(), Subclass)
1205
1206 class Subclass(Mock):
1207 def _get_child_mock(self, **kwargs):
1208 return Mock(**kwargs)
1209
1210 mock = Subclass()
1211 self.assertNotIsInstance(mock.foo, Subclass)
1212 self.assertNotIsInstance(mock(), Subclass)
1213
1214
1215 def test_arg_lists(self):
1216 mocks = [
1217 Mock(),
1218 MagicMock(),
1219 NonCallableMock(),
1220 NonCallableMagicMock()
1221 ]
1222
1223 def assert_attrs(mock):
1224 names = 'call_args_list', 'method_calls', 'mock_calls'
1225 for name in names:
1226 attr = getattr(mock, name)
1227 self.assertIsInstance(attr, _CallList)
1228 self.assertIsInstance(attr, list)
1229 self.assertEqual(attr, [])
1230
1231 for mock in mocks:
1232 assert_attrs(mock)
1233
1234 if callable(mock):
1235 mock()
1236 mock(1, 2)
1237 mock(a=3)
1238
1239 mock.reset_mock()
1240 assert_attrs(mock)
1241
1242 mock.foo()
1243 mock.foo.bar(1, a=3)
1244 mock.foo(1).bar().baz(3)
1245
1246 mock.reset_mock()
1247 assert_attrs(mock)
1248
1249
1250 def test_call_args_two_tuple(self):
1251 mock = Mock()
1252 mock(1, a=3)
1253 mock(2, b=4)
1254
1255 self.assertEqual(len(mock.call_args), 2)
Kumar Akshayb0df45e2019-03-22 13:40:40 +05301256 self.assertEqual(mock.call_args.args, (2,))
1257 self.assertEqual(mock.call_args.kwargs, dict(b=4))
Michael Foord345266a2012-03-14 12:24:34 -07001258
1259 expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))]
1260 for expected, call_args in zip(expected_list, mock.call_args_list):
1261 self.assertEqual(len(call_args), 2)
1262 self.assertEqual(expected[0], call_args[0])
1263 self.assertEqual(expected[1], call_args[1])
1264
1265
1266 def test_side_effect_iterator(self):
1267 mock = Mock(side_effect=iter([1, 2, 3]))
1268 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1269 self.assertRaises(StopIteration, mock)
1270
1271 mock = MagicMock(side_effect=['a', 'b', 'c'])
1272 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1273 self.assertRaises(StopIteration, mock)
1274
1275 mock = Mock(side_effect='ghi')
1276 self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i'])
1277 self.assertRaises(StopIteration, mock)
1278
1279 class Foo(object):
1280 pass
1281 mock = MagicMock(side_effect=Foo)
1282 self.assertIsInstance(mock(), Foo)
1283
1284 mock = Mock(side_effect=Iter())
1285 self.assertEqual([mock(), mock(), mock(), mock()],
1286 ['this', 'is', 'an', 'iter'])
1287 self.assertRaises(StopIteration, mock)
1288
1289
Michael Foord2cd48732012-04-21 15:52:11 +01001290 def test_side_effect_iterator_exceptions(self):
1291 for Klass in Mock, MagicMock:
1292 iterable = (ValueError, 3, KeyError, 6)
1293 m = Klass(side_effect=iterable)
1294 self.assertRaises(ValueError, m)
1295 self.assertEqual(m(), 3)
1296 self.assertRaises(KeyError, m)
1297 self.assertEqual(m(), 6)
1298
1299
Michael Foord345266a2012-03-14 12:24:34 -07001300 def test_side_effect_setting_iterator(self):
1301 mock = Mock()
1302 mock.side_effect = iter([1, 2, 3])
1303 self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
1304 self.assertRaises(StopIteration, mock)
1305 side_effect = mock.side_effect
1306 self.assertIsInstance(side_effect, type(iter([])))
1307
1308 mock.side_effect = ['a', 'b', 'c']
1309 self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
1310 self.assertRaises(StopIteration, mock)
1311 side_effect = mock.side_effect
1312 self.assertIsInstance(side_effect, type(iter([])))
1313
1314 this_iter = Iter()
1315 mock.side_effect = this_iter
1316 self.assertEqual([mock(), mock(), mock(), mock()],
1317 ['this', 'is', 'an', 'iter'])
1318 self.assertRaises(StopIteration, mock)
1319 self.assertIs(mock.side_effect, this_iter)
1320
Andrew Svetlov8b2cd752013-04-07 16:42:24 +03001321 def test_side_effect_iterator_default(self):
1322 mock = Mock(return_value=2)
1323 mock.side_effect = iter([1, DEFAULT])
1324 self.assertEqual([mock(), mock()], [1, 2])
Michael Foord345266a2012-03-14 12:24:34 -07001325
1326 def test_assert_has_calls_any_order(self):
1327 mock = Mock()
1328 mock(1, 2)
1329 mock(a=3)
1330 mock(3, 4)
1331 mock(b=6)
1332 mock(b=6)
1333
1334 kalls = [
1335 call(1, 2), ({'a': 3},),
1336 ((3, 4),), ((), {'a': 3}),
1337 ('', (1, 2)), ('', {'a': 3}),
1338 ('', (1, 2), {}), ('', (), {'a': 3})
1339 ]
1340 for kall in kalls:
1341 mock.assert_has_calls([kall], any_order=True)
1342
1343 for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
1344 self.assertRaises(
1345 AssertionError, mock.assert_has_calls,
1346 [kall], any_order=True
1347 )
1348
1349 kall_lists = [
1350 [call(1, 2), call(b=6)],
1351 [call(3, 4), call(1, 2)],
1352 [call(b=6), call(b=6)],
1353 ]
1354
1355 for kall_list in kall_lists:
1356 mock.assert_has_calls(kall_list, any_order=True)
1357
1358 kall_lists = [
1359 [call(b=6), call(b=6), call(b=6)],
1360 [call(1, 2), call(1, 2)],
1361 [call(3, 4), call(1, 2), call(5, 7)],
1362 [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
1363 ]
1364 for kall_list in kall_lists:
1365 self.assertRaises(
1366 AssertionError, mock.assert_has_calls,
1367 kall_list, any_order=True
1368 )
1369
1370 def test_assert_has_calls(self):
1371 kalls1 = [
1372 call(1, 2), ({'a': 3},),
1373 ((3, 4),), call(b=6),
1374 ('', (1,), {'b': 6}),
1375 ]
1376 kalls2 = [call.foo(), call.bar(1)]
1377 kalls2.extend(call.spam().baz(a=3).call_list())
1378 kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
1379
1380 mocks = []
1381 for mock in Mock(), MagicMock():
1382 mock(1, 2)
1383 mock(a=3)
1384 mock(3, 4)
1385 mock(b=6)
1386 mock(1, b=6)
1387 mocks.append((mock, kalls1))
1388
1389 mock = Mock()
1390 mock.foo()
1391 mock.bar(1)
1392 mock.spam().baz(a=3)
1393 mock.bam(set(), foo={}).fish([1])
1394 mocks.append((mock, kalls2))
1395
1396 for mock, kalls in mocks:
1397 for i in range(len(kalls)):
1398 for step in 1, 2, 3:
1399 these = kalls[i:i+step]
1400 mock.assert_has_calls(these)
1401
1402 if len(these) > 1:
1403 self.assertRaises(
1404 AssertionError,
1405 mock.assert_has_calls,
1406 list(reversed(these))
1407 )
1408
1409
Xtreakc9612782019-08-29 11:39:01 +05301410 def test_assert_has_calls_nested_spec(self):
1411 class Something:
1412
1413 def __init__(self): pass
1414 def meth(self, a, b, c, d=None): pass
1415
1416 class Foo:
1417
1418 def __init__(self, a): pass
1419 def meth1(self, a, b): pass
1420
1421 mock_class = create_autospec(Something)
1422
1423 for m in [mock_class, mock_class()]:
1424 m.meth(1, 2, 3, d=1)
1425 m.assert_has_calls([call.meth(1, 2, 3, d=1)])
1426 m.assert_has_calls([call.meth(1, 2, 3, 1)])
1427
1428 mock_class.reset_mock()
1429
1430 for m in [mock_class, mock_class()]:
1431 self.assertRaises(AssertionError, m.assert_has_calls, [call.Foo()])
1432 m.Foo(1).meth1(1, 2)
1433 m.assert_has_calls([call.Foo(1), call.Foo(1).meth1(1, 2)])
1434 m.Foo.assert_has_calls([call(1), call().meth1(1, 2)])
1435
1436 mock_class.reset_mock()
1437
1438 invalid_calls = [call.meth(1),
1439 call.non_existent(1),
1440 call.Foo().non_existent(1),
1441 call.Foo().meth(1, 2, 3, 4)]
1442
1443 for kall in invalid_calls:
1444 self.assertRaises(AssertionError,
1445 mock_class.assert_has_calls,
1446 [kall]
1447 )
1448
1449
1450 def test_assert_has_calls_nested_without_spec(self):
1451 m = MagicMock()
1452 m().foo().bar().baz()
1453 m.one().two().three()
1454 calls = call.one().two().three().call_list()
1455 m.assert_has_calls(calls)
1456
1457
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001458 def test_assert_has_calls_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001459 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001460
1461 mock = Mock(spec=f)
1462
1463 mock(1, b=2, c=3)
1464 mock(4, 5, c=6, d=7)
1465 mock(10, 11, c=12)
1466 calls = [
1467 ('', (1, 2, 3), {}),
1468 ('', (4, 5, 6), {'d': 7}),
1469 ((10, 11, 12), {}),
1470 ]
1471 mock.assert_has_calls(calls)
1472 mock.assert_has_calls(calls, any_order=True)
1473 mock.assert_has_calls(calls[1:])
1474 mock.assert_has_calls(calls[1:], any_order=True)
1475 mock.assert_has_calls(calls[:-1])
1476 mock.assert_has_calls(calls[:-1], any_order=True)
1477 # Reversed order
1478 calls = list(reversed(calls))
1479 with self.assertRaises(AssertionError):
1480 mock.assert_has_calls(calls)
1481 mock.assert_has_calls(calls, any_order=True)
1482 with self.assertRaises(AssertionError):
1483 mock.assert_has_calls(calls[1:])
1484 mock.assert_has_calls(calls[1:], any_order=True)
1485 with self.assertRaises(AssertionError):
1486 mock.assert_has_calls(calls[:-1])
1487 mock.assert_has_calls(calls[:-1], any_order=True)
1488
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001489 def test_assert_has_calls_not_matching_spec_error(self):
Samuel Freilich2180f6b2019-09-24 18:04:29 -04001490 def f(x=None): pass
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001491
1492 mock = Mock(spec=f)
Samuel Freilich2180f6b2019-09-24 18:04:29 -04001493 mock(1)
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001494
1495 with self.assertRaisesRegex(
1496 AssertionError,
Samuel Freilich2180f6b2019-09-24 18:04:29 -04001497 '^{}$'.format(
1498 re.escape('Calls not found.\n'
1499 'Expected: [call()]\n'
1500 'Actual: [call(1)]'))) as cm:
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001501 mock.assert_has_calls([call()])
1502 self.assertIsNone(cm.exception.__cause__)
1503
Samuel Freilich2180f6b2019-09-24 18:04:29 -04001504
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001505 with self.assertRaisesRegex(
1506 AssertionError,
Samuel Freilich2180f6b2019-09-24 18:04:29 -04001507 '^{}$'.format(
1508 re.escape(
1509 'Error processing expected calls.\n'
1510 "Errors: [None, TypeError('too many positional arguments')]\n"
1511 "Expected: [call(), call(1, 2)]\n"
1512 'Actual: [call(1)]'))) as cm:
1513 mock.assert_has_calls([call(), call(1, 2)])
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04001514 self.assertIsInstance(cm.exception.__cause__, TypeError)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001515
Michael Foord345266a2012-03-14 12:24:34 -07001516 def test_assert_any_call(self):
1517 mock = Mock()
1518 mock(1, 2)
1519 mock(a=3)
1520 mock(1, b=6)
1521
1522 mock.assert_any_call(1, 2)
1523 mock.assert_any_call(a=3)
1524 mock.assert_any_call(1, b=6)
1525
1526 self.assertRaises(
1527 AssertionError,
1528 mock.assert_any_call
1529 )
1530 self.assertRaises(
1531 AssertionError,
1532 mock.assert_any_call,
1533 1, 3
1534 )
1535 self.assertRaises(
1536 AssertionError,
1537 mock.assert_any_call,
1538 a=4
1539 )
1540
1541
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001542 def test_assert_any_call_with_function_spec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001543 def f(a, b, c, d=None): pass
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001544
1545 mock = Mock(spec=f)
1546
1547 mock(1, b=2, c=3)
1548 mock(4, 5, c=6, d=7)
1549 mock.assert_any_call(1, 2, 3)
1550 mock.assert_any_call(a=1, b=2, c=3)
1551 mock.assert_any_call(4, 5, 6, 7)
1552 mock.assert_any_call(a=4, b=5, c=6, d=7)
1553 self.assertRaises(AssertionError, mock.assert_any_call,
1554 1, b=3, c=2)
1555 # Expected call doesn't match the spec's signature
1556 with self.assertRaises(AssertionError) as cm:
1557 mock.assert_any_call(e=8)
1558 self.assertIsInstance(cm.exception.__cause__, TypeError)
1559
1560
Michael Foord345266a2012-03-14 12:24:34 -07001561 def test_mock_calls_create_autospec(self):
Chris Withersadbf1782019-05-01 23:04:04 +01001562 def f(a, b): pass
Michael Foord345266a2012-03-14 12:24:34 -07001563 obj = Iter()
1564 obj.f = f
1565
1566 funcs = [
1567 create_autospec(f),
1568 create_autospec(obj).f
1569 ]
1570 for func in funcs:
1571 func(1, 2)
1572 func(3, 4)
1573
1574 self.assertEqual(
1575 func.mock_calls, [call(1, 2), call(3, 4)]
1576 )
1577
Kushal Das484f8a82014-04-16 01:05:50 +05301578 #Issue21222
1579 def test_create_autospec_with_name(self):
1580 m = mock.create_autospec(object(), name='sweet_func')
1581 self.assertIn('sweet_func', repr(m))
Michael Foord345266a2012-03-14 12:24:34 -07001582
Xtreak9b218562019-04-22 08:00:23 +05301583 #Issue23078
1584 def test_create_autospec_classmethod_and_staticmethod(self):
1585 class TestClass:
1586 @classmethod
Chris Withersadbf1782019-05-01 23:04:04 +01001587 def class_method(cls): pass
Xtreak9b218562019-04-22 08:00:23 +05301588
1589 @staticmethod
Chris Withersadbf1782019-05-01 23:04:04 +01001590 def static_method(): pass
Xtreak9b218562019-04-22 08:00:23 +05301591 for method in ('class_method', 'static_method'):
1592 with self.subTest(method=method):
1593 mock_method = mock.create_autospec(getattr(TestClass, method))
1594 mock_method()
1595 mock_method.assert_called_once_with()
1596 self.assertRaises(TypeError, mock_method, 'extra_arg')
1597
Kushal Das8c145342014-04-16 23:32:21 +05301598 #Issue21238
1599 def test_mock_unsafe(self):
1600 m = Mock()
vabr-g9fc57132020-12-10 19:35:28 +01001601 msg = "is not a valid assertion. Use a spec for the mock"
Zackery Spytzb9b08cd2019-05-08 11:32:24 -06001602 with self.assertRaisesRegex(AttributeError, msg):
Kushal Das8c145342014-04-16 23:32:21 +05301603 m.assert_foo_call()
Zackery Spytzb9b08cd2019-05-08 11:32:24 -06001604 with self.assertRaisesRegex(AttributeError, msg):
Kushal Das8c145342014-04-16 23:32:21 +05301605 m.assret_foo_call()
vabr-g4662fa92020-11-05 18:04:38 +01001606 with self.assertRaisesRegex(AttributeError, msg):
1607 m.asert_foo_call()
1608 with self.assertRaisesRegex(AttributeError, msg):
1609 m.aseert_foo_call()
1610 with self.assertRaisesRegex(AttributeError, msg):
1611 m.assrt_foo_call()
Kushal Das8c145342014-04-16 23:32:21 +05301612 m = Mock(unsafe=True)
1613 m.assert_foo_call()
1614 m.assret_foo_call()
vabr-g4662fa92020-11-05 18:04:38 +01001615 m.asert_foo_call()
1616 m.aseert_foo_call()
1617 m.assrt_foo_call()
Kushal Das8c145342014-04-16 23:32:21 +05301618
Kushal Das8af9db32014-04-17 01:36:14 +05301619 #Issue21262
1620 def test_assert_not_called(self):
1621 m = Mock()
1622 m.hello.assert_not_called()
1623 m.hello()
1624 with self.assertRaises(AssertionError):
1625 m.hello.assert_not_called()
1626
Petter Strandmark47d94242018-10-28 21:37:10 +01001627 def test_assert_not_called_message(self):
1628 m = Mock()
1629 m(1, 2)
1630 self.assertRaisesRegex(AssertionError,
1631 re.escape("Calls: [call(1, 2)]"),
1632 m.assert_not_called)
1633
Victor Stinner2c2a4e62016-03-11 22:17:48 +01001634 def test_assert_called(self):
1635 m = Mock()
1636 with self.assertRaises(AssertionError):
1637 m.hello.assert_called()
1638 m.hello()
1639 m.hello.assert_called()
1640
1641 m.hello()
1642 m.hello.assert_called()
1643
1644 def test_assert_called_once(self):
1645 m = Mock()
1646 with self.assertRaises(AssertionError):
1647 m.hello.assert_called_once()
1648 m.hello()
1649 m.hello.assert_called_once()
1650
1651 m.hello()
1652 with self.assertRaises(AssertionError):
1653 m.hello.assert_called_once()
1654
Petter Strandmark47d94242018-10-28 21:37:10 +01001655 def test_assert_called_once_message(self):
1656 m = Mock()
1657 m(1, 2)
1658 m(3)
1659 self.assertRaisesRegex(AssertionError,
1660 re.escape("Calls: [call(1, 2), call(3)]"),
1661 m.assert_called_once)
1662
1663 def test_assert_called_once_message_not_called(self):
1664 m = Mock()
1665 with self.assertRaises(AssertionError) as e:
1666 m.assert_called_once()
1667 self.assertNotIn("Calls:", str(e.exception))
1668
Xtreak9d607062019-09-09 16:25:22 +05301669 #Issue37212 printout of keyword args now preserves the original order
1670 def test_ordered_call_signature(self):
Kushal Das047f14c2014-06-09 13:45:56 +05301671 m = Mock()
1672 m.hello(name='hello', daddy='hero')
Xtreak9d607062019-09-09 16:25:22 +05301673 text = "call(name='hello', daddy='hero')"
R David Murray130a5662014-06-11 17:09:43 -04001674 self.assertEqual(repr(m.hello.call_args), text)
Kushal Das8af9db32014-04-17 01:36:14 +05301675
Kushal Dasa37b9582014-09-16 18:33:37 +05301676 #Issue21270 overrides tuple methods for mock.call objects
1677 def test_override_tuple_methods(self):
1678 c = call.count()
1679 i = call.index(132,'hello')
1680 m = Mock()
1681 m.count()
1682 m.index(132,"hello")
1683 self.assertEqual(m.method_calls[0], c)
1684 self.assertEqual(m.method_calls[1], i)
1685
Kushal Das9cd39a12016-06-02 10:20:16 -07001686 def test_reset_return_sideeffect(self):
1687 m = Mock(return_value=10, side_effect=[2,3])
1688 m.reset_mock(return_value=True, side_effect=True)
1689 self.assertIsInstance(m.return_value, Mock)
1690 self.assertEqual(m.side_effect, None)
1691
1692 def test_reset_return(self):
1693 m = Mock(return_value=10, side_effect=[2,3])
1694 m.reset_mock(return_value=True)
1695 self.assertIsInstance(m.return_value, Mock)
1696 self.assertNotEqual(m.side_effect, None)
1697
1698 def test_reset_sideeffect(self):
Vegard Stikbakkeaef7dc82020-01-25 16:44:46 +01001699 m = Mock(return_value=10, side_effect=[2, 3])
Kushal Das9cd39a12016-06-02 10:20:16 -07001700 m.reset_mock(side_effect=True)
1701 self.assertEqual(m.return_value, 10)
1702 self.assertEqual(m.side_effect, None)
1703
Vegard Stikbakkeaef7dc82020-01-25 16:44:46 +01001704 def test_reset_return_with_children(self):
1705 m = MagicMock(f=MagicMock(return_value=1))
1706 self.assertEqual(m.f(), 1)
1707 m.reset_mock(return_value=True)
1708 self.assertNotEqual(m.f(), 1)
1709
1710 def test_reset_return_with_children_side_effect(self):
1711 m = MagicMock(f=MagicMock(side_effect=[2, 3]))
1712 self.assertNotEqual(m.f.side_effect, None)
1713 m.reset_mock(side_effect=True)
1714 self.assertEqual(m.f.side_effect, None)
1715
Michael Foord345266a2012-03-14 12:24:34 -07001716 def test_mock_add_spec(self):
1717 class _One(object):
1718 one = 1
1719 class _Two(object):
1720 two = 2
1721 class Anything(object):
1722 one = two = three = 'four'
1723
1724 klasses = [
1725 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
1726 ]
1727 for Klass in list(klasses):
1728 klasses.append(lambda K=Klass: K(spec=Anything))
1729 klasses.append(lambda K=Klass: K(spec_set=Anything))
1730
1731 for Klass in klasses:
1732 for kwargs in dict(), dict(spec_set=True):
1733 mock = Klass()
1734 #no error
1735 mock.one, mock.two, mock.three
1736
1737 for One, Two in [(_One, _Two), (['one'], ['two'])]:
1738 for kwargs in dict(), dict(spec_set=True):
1739 mock.mock_add_spec(One, **kwargs)
1740
1741 mock.one
1742 self.assertRaises(
1743 AttributeError, getattr, mock, 'two'
1744 )
1745 self.assertRaises(
1746 AttributeError, getattr, mock, 'three'
1747 )
1748 if 'spec_set' in kwargs:
1749 self.assertRaises(
1750 AttributeError, setattr, mock, 'three', None
1751 )
1752
1753 mock.mock_add_spec(Two, **kwargs)
1754 self.assertRaises(
1755 AttributeError, getattr, mock, 'one'
1756 )
1757 mock.two
1758 self.assertRaises(
1759 AttributeError, getattr, mock, 'three'
1760 )
1761 if 'spec_set' in kwargs:
1762 self.assertRaises(
1763 AttributeError, setattr, mock, 'three', None
1764 )
1765 # note that creating a mock, setting an instance attribute, and
1766 # *then* setting a spec doesn't work. Not the intended use case
1767
1768
1769 def test_mock_add_spec_magic_methods(self):
1770 for Klass in MagicMock, NonCallableMagicMock:
1771 mock = Klass()
1772 int(mock)
1773
1774 mock.mock_add_spec(object)
1775 self.assertRaises(TypeError, int, mock)
1776
1777 mock = Klass()
1778 mock['foo']
1779 mock.__int__.return_value =4
1780
1781 mock.mock_add_spec(int)
1782 self.assertEqual(int(mock), 4)
1783 self.assertRaises(TypeError, lambda: mock['foo'])
1784
1785
1786 def test_adding_child_mock(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07001787 for Klass in (NonCallableMock, Mock, MagicMock, NonCallableMagicMock,
1788 AsyncMock):
Michael Foord345266a2012-03-14 12:24:34 -07001789 mock = Klass()
1790
1791 mock.foo = Mock()
1792 mock.foo()
1793
1794 self.assertEqual(mock.method_calls, [call.foo()])
1795 self.assertEqual(mock.mock_calls, [call.foo()])
1796
1797 mock = Klass()
1798 mock.bar = Mock(name='name')
1799 mock.bar()
1800 self.assertEqual(mock.method_calls, [])
1801 self.assertEqual(mock.mock_calls, [])
1802
1803 # mock with an existing _new_parent but no name
1804 mock = Klass()
1805 mock.baz = MagicMock()()
1806 mock.baz()
1807 self.assertEqual(mock.method_calls, [])
1808 self.assertEqual(mock.mock_calls, [])
1809
1810
1811 def test_adding_return_value_mock(self):
1812 for Klass in Mock, MagicMock:
1813 mock = Klass()
1814 mock.return_value = MagicMock()
1815
1816 mock()()
1817 self.assertEqual(mock.mock_calls, [call(), call()()])
1818
1819
1820 def test_manager_mock(self):
1821 class Foo(object):
1822 one = 'one'
1823 two = 'two'
1824 manager = Mock()
1825 p1 = patch.object(Foo, 'one')
1826 p2 = patch.object(Foo, 'two')
1827
1828 mock_one = p1.start()
1829 self.addCleanup(p1.stop)
1830 mock_two = p2.start()
1831 self.addCleanup(p2.stop)
1832
1833 manager.attach_mock(mock_one, 'one')
1834 manager.attach_mock(mock_two, 'two')
1835
1836 Foo.two()
1837 Foo.one()
1838
1839 self.assertEqual(manager.mock_calls, [call.two(), call.one()])
1840
1841
1842 def test_magic_methods_mock_calls(self):
1843 for Klass in Mock, MagicMock:
1844 m = Klass()
1845 m.__int__ = Mock(return_value=3)
1846 m.__float__ = MagicMock(return_value=3.0)
1847 int(m)
1848 float(m)
1849
1850 self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
1851 self.assertEqual(m.method_calls, [])
1852
Robert Collins5329aaa2015-07-17 20:08:45 +12001853 def test_mock_open_reuse_issue_21750(self):
1854 mocked_open = mock.mock_open(read_data='data')
1855 f1 = mocked_open('a-name')
Robert Collinsca647ef2015-07-24 03:48:20 +12001856 f1_data = f1.read()
Robert Collins5329aaa2015-07-17 20:08:45 +12001857 f2 = mocked_open('another-name')
Robert Collinsca647ef2015-07-24 03:48:20 +12001858 f2_data = f2.read()
1859 self.assertEqual(f1_data, f2_data)
1860
Tony Flury20870232018-09-12 23:21:16 +01001861 def test_mock_open_dunder_iter_issue(self):
1862 # Test dunder_iter method generates the expected result and
1863 # consumes the iterator.
1864 mocked_open = mock.mock_open(read_data='Remarkable\nNorwegian Blue')
1865 f1 = mocked_open('a-name')
1866 lines = [line for line in f1]
1867 self.assertEqual(lines[0], 'Remarkable\n')
1868 self.assertEqual(lines[1], 'Norwegian Blue')
1869 self.assertEqual(list(f1), [])
1870
Damien Nadé394119a2019-05-23 12:03:25 +02001871 def test_mock_open_using_next(self):
1872 mocked_open = mock.mock_open(read_data='1st line\n2nd line\n3rd line')
1873 f1 = mocked_open('a-name')
1874 line1 = next(f1)
1875 line2 = f1.__next__()
1876 lines = [line for line in f1]
1877 self.assertEqual(line1, '1st line\n')
1878 self.assertEqual(line2, '2nd line\n')
1879 self.assertEqual(lines[0], '3rd line')
1880 self.assertEqual(list(f1), [])
1881 with self.assertRaises(StopIteration):
1882 next(f1)
1883
Chris Withersdb5e86a2020-01-29 16:24:54 +00001884 def test_mock_open_next_with_readline_with_return_value(self):
1885 mopen = mock.mock_open(read_data='foo\nbarn')
1886 mopen.return_value.readline.return_value = 'abc'
1887 self.assertEqual('abc', next(mopen()))
1888
Robert Collinsca647ef2015-07-24 03:48:20 +12001889 def test_mock_open_write(self):
1890 # Test exception in file writing write()
1891 mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV'))
1892 with mock.patch('tempfile.NamedTemporaryFile', mock_namedtemp):
1893 mock_filehandle = mock_namedtemp.return_value
1894 mock_write = mock_filehandle.write
1895 mock_write.side_effect = OSError('Test 2 Error')
1896 def attempt():
1897 tempfile.NamedTemporaryFile().write('asd')
1898 self.assertRaises(OSError, attempt)
1899
1900 def test_mock_open_alter_readline(self):
1901 mopen = mock.mock_open(read_data='foo\nbarn')
1902 mopen.return_value.readline.side_effect = lambda *args:'abc'
1903 first = mopen().readline()
1904 second = mopen().readline()
1905 self.assertEqual('abc', first)
1906 self.assertEqual('abc', second)
Michael Foord345266a2012-03-14 12:24:34 -07001907
Robert Collins9549a3e2016-05-16 15:22:01 +12001908 def test_mock_open_after_eof(self):
1909 # read, readline and readlines should work after end of file.
1910 _open = mock.mock_open(read_data='foo')
1911 h = _open('bar')
1912 h.read()
1913 self.assertEqual('', h.read())
1914 self.assertEqual('', h.read())
1915 self.assertEqual('', h.readline())
1916 self.assertEqual('', h.readline())
1917 self.assertEqual([], h.readlines())
1918 self.assertEqual([], h.readlines())
1919
Michael Foord345266a2012-03-14 12:24:34 -07001920 def test_mock_parents(self):
1921 for Klass in Mock, MagicMock:
1922 m = Klass()
1923 original_repr = repr(m)
1924 m.return_value = m
1925 self.assertIs(m(), m)
1926 self.assertEqual(repr(m), original_repr)
1927
1928 m.reset_mock()
1929 self.assertIs(m(), m)
1930 self.assertEqual(repr(m), original_repr)
1931
1932 m = Klass()
1933 m.b = m.a
1934 self.assertIn("name='mock.a'", repr(m.b))
1935 self.assertIn("name='mock.a'", repr(m.a))
1936 m.reset_mock()
1937 self.assertIn("name='mock.a'", repr(m.b))
1938 self.assertIn("name='mock.a'", repr(m.a))
1939
1940 m = Klass()
1941 original_repr = repr(m)
1942 m.a = m()
1943 m.a.return_value = m
1944
1945 self.assertEqual(repr(m), original_repr)
1946 self.assertEqual(repr(m.a()), original_repr)
1947
1948
1949 def test_attach_mock(self):
1950 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
1951 for Klass in classes:
1952 for Klass2 in classes:
1953 m = Klass()
1954
1955 m2 = Klass2(name='foo')
1956 m.attach_mock(m2, 'bar')
1957
1958 self.assertIs(m.bar, m2)
1959 self.assertIn("name='mock.bar'", repr(m2))
1960
1961 m.bar.baz(1)
1962 self.assertEqual(m.mock_calls, [call.bar.baz(1)])
1963 self.assertEqual(m.method_calls, [call.bar.baz(1)])
1964
1965
1966 def test_attach_mock_return_value(self):
1967 classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
1968 for Klass in Mock, MagicMock:
1969 for Klass2 in classes:
1970 m = Klass()
1971
1972 m2 = Klass2(name='foo')
1973 m.attach_mock(m2, 'return_value')
1974
1975 self.assertIs(m(), m2)
1976 self.assertIn("name='mock()'", repr(m2))
1977
1978 m2.foo()
1979 self.assertEqual(m.mock_calls, call().foo().call_list())
1980
1981
Xtreak7397cda2019-07-22 13:08:22 +05301982 def test_attach_mock_patch_autospec(self):
1983 parent = Mock()
1984
1985 with mock.patch(f'{__name__}.something', autospec=True) as mock_func:
1986 self.assertEqual(mock_func.mock._extract_mock_name(), 'something')
1987 parent.attach_mock(mock_func, 'child')
1988 parent.child(1)
1989 something(2)
1990 mock_func(3)
1991
1992 parent_calls = [call.child(1), call.child(2), call.child(3)]
1993 child_calls = [call(1), call(2), call(3)]
1994 self.assertEqual(parent.mock_calls, parent_calls)
1995 self.assertEqual(parent.child.mock_calls, child_calls)
1996 self.assertEqual(something.mock_calls, child_calls)
1997 self.assertEqual(mock_func.mock_calls, child_calls)
1998 self.assertIn('mock.child', repr(parent.child.mock))
1999 self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child')
2000
2001
Karthikeyan Singaravelan66b00a92020-01-24 18:44:29 +05302002 def test_attach_mock_patch_autospec_signature(self):
2003 with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked:
2004 manager = Mock()
2005 manager.attach_mock(mocked, 'attach_meth')
2006 obj = Something()
2007 obj.meth(1, 2, 3, d=4)
2008 manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)])
2009 obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
2010 mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
2011
2012 with mock.patch(f'{__name__}.something', autospec=True) as mocked:
2013 manager = Mock()
2014 manager.attach_mock(mocked, 'attach_func')
2015 something(1)
2016 manager.assert_has_calls([call.attach_func(1)])
2017 something.assert_has_calls([call(1)])
2018 mocked.assert_has_calls([call(1)])
2019
2020 with mock.patch(f'{__name__}.Something', autospec=True) as mocked:
2021 manager = Mock()
2022 manager.attach_mock(mocked, 'attach_obj')
2023 obj = Something()
2024 obj.meth(1, 2, 3, d=4)
2025 manager.assert_has_calls([call.attach_obj(),
2026 call.attach_obj().meth(1, 2, 3, d=4)])
2027 obj.meth.assert_has_calls([call(1, 2, 3, d=4)])
2028 mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)])
2029
2030
Michael Foord345266a2012-03-14 12:24:34 -07002031 def test_attribute_deletion(self):
Michael Foord468ec342013-09-15 20:05:19 +12002032 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2033 NonCallableMock()):
Michael Foord345266a2012-03-14 12:24:34 -07002034 self.assertTrue(hasattr(mock, 'm'))
2035
2036 del mock.m
2037 self.assertFalse(hasattr(mock, 'm'))
2038
2039 del mock.f
2040 self.assertFalse(hasattr(mock, 'f'))
2041 self.assertRaises(AttributeError, getattr, mock, 'f')
2042
2043
Pablo Galindo222d3032019-01-21 08:57:46 +00002044 def test_mock_does_not_raise_on_repeated_attribute_deletion(self):
2045 # bpo-20239: Assigning and deleting twice an attribute raises.
2046 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2047 NonCallableMock()):
2048 mock.foo = 3
2049 self.assertTrue(hasattr(mock, 'foo'))
2050 self.assertEqual(mock.foo, 3)
2051
2052 del mock.foo
2053 self.assertFalse(hasattr(mock, 'foo'))
2054
2055 mock.foo = 4
2056 self.assertTrue(hasattr(mock, 'foo'))
2057 self.assertEqual(mock.foo, 4)
2058
2059 del mock.foo
2060 self.assertFalse(hasattr(mock, 'foo'))
2061
2062
2063 def test_mock_raises_when_deleting_nonexistent_attribute(self):
2064 for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
2065 NonCallableMock()):
2066 del mock.foo
2067 with self.assertRaises(AttributeError):
2068 del mock.foo
2069
2070
Xtreakedeca922018-12-01 15:33:54 +05302071 def test_reset_mock_does_not_raise_on_attr_deletion(self):
2072 # bpo-31177: reset_mock should not raise AttributeError when attributes
2073 # were deleted in a mock instance
2074 mock = Mock()
2075 mock.child = True
2076 del mock.child
2077 mock.reset_mock()
2078 self.assertFalse(hasattr(mock, 'child'))
2079
2080
Michael Foord345266a2012-03-14 12:24:34 -07002081 def test_class_assignable(self):
2082 for mock in Mock(), MagicMock():
2083 self.assertNotIsInstance(mock, int)
2084
2085 mock.__class__ = int
2086 self.assertIsInstance(mock, int)
2087 mock.foo
2088
Andrew Dunaie63e6172018-12-04 11:08:45 +02002089 def test_name_attribute_of_call(self):
2090 # bpo-35357: _Call should not disclose any attributes whose names
2091 # may clash with popular ones (such as ".name")
2092 self.assertIsNotNone(call.name)
2093 self.assertEqual(type(call.name), _Call)
2094 self.assertEqual(type(call.name().name), _Call)
2095
2096 def test_parent_attribute_of_call(self):
2097 # bpo-35357: _Call should not disclose any attributes whose names
2098 # may clash with popular ones (such as ".parent")
2099 self.assertIsNotNone(call.parent)
2100 self.assertEqual(type(call.parent), _Call)
2101 self.assertEqual(type(call.parent().parent), _Call)
2102
Michael Foord345266a2012-03-14 12:24:34 -07002103
Xtreak9c3f2842019-02-26 03:16:34 +05302104 def test_parent_propagation_with_create_autospec(self):
2105
Chris Withersadbf1782019-05-01 23:04:04 +01002106 def foo(a, b): pass
Xtreak9c3f2842019-02-26 03:16:34 +05302107
2108 mock = Mock()
2109 mock.child = create_autospec(foo)
2110 mock.child(1, 2)
2111
2112 self.assertRaises(TypeError, mock.child, 1)
2113 self.assertEqual(mock.mock_calls, [call.child(1, 2)])
Xtreak7397cda2019-07-22 13:08:22 +05302114 self.assertIn('mock.child', repr(mock.child.mock))
2115
2116 def test_parent_propagation_with_autospec_attach_mock(self):
2117
2118 def foo(a, b): pass
2119
2120 parent = Mock()
2121 parent.attach_mock(create_autospec(foo, name='bar'), 'child')
2122 parent.child(1, 2)
2123
2124 self.assertRaises(TypeError, parent.child, 1)
2125 self.assertEqual(parent.child.mock_calls, [call.child(1, 2)])
2126 self.assertIn('mock.child', repr(parent.child.mock))
2127
Xtreak9c3f2842019-02-26 03:16:34 +05302128
Xtreak830b43d2019-04-14 00:42:33 +05302129 def test_isinstance_under_settrace(self):
2130 # bpo-36593 : __class__ is not set for a class that has __class__
2131 # property defined when it's used with sys.settrace(trace) set.
2132 # Delete the module to force reimport with tracing function set
2133 # restore the old reference later since there are other tests that are
2134 # dependent on unittest.mock.patch. In testpatch.PatchTest
2135 # test_patch_dict_test_prefix and test_patch_test_prefix not restoring
2136 # causes the objects patched to go out of sync
2137
2138 old_patch = unittest.mock.patch
2139
2140 # Directly using __setattr__ on unittest.mock causes current imported
2141 # reference to be updated. Use a lambda so that during cleanup the
2142 # re-imported new reference is updated.
2143 self.addCleanup(lambda patch: setattr(unittest.mock, 'patch', patch),
2144 old_patch)
2145
2146 with patch.dict('sys.modules'):
2147 del sys.modules['unittest.mock']
2148
Chris Withersadbf1782019-05-01 23:04:04 +01002149 # This trace will stop coverage being measured ;-)
2150 def trace(frame, event, arg): # pragma: no cover
Xtreak830b43d2019-04-14 00:42:33 +05302151 return trace
2152
Chris Withersadbf1782019-05-01 23:04:04 +01002153 self.addCleanup(sys.settrace, sys.gettrace())
Xtreak830b43d2019-04-14 00:42:33 +05302154 sys.settrace(trace)
Xtreak830b43d2019-04-14 00:42:33 +05302155
2156 from unittest.mock import (
2157 Mock, MagicMock, NonCallableMock, NonCallableMagicMock
2158 )
2159
2160 mocks = [
Lisa Roachef048512019-09-23 20:49:40 -07002161 Mock, MagicMock, NonCallableMock, NonCallableMagicMock, AsyncMock
Xtreak830b43d2019-04-14 00:42:33 +05302162 ]
2163
2164 for mock in mocks:
2165 obj = mock(spec=Something)
2166 self.assertIsInstance(obj, Something)
2167
idanw206c598a042020-12-06 11:59:36 +02002168 def test_bool_not_called_when_passing_spec_arg(self):
2169 class Something:
2170 def __init__(self):
2171 self.obj_with_bool_func = unittest.mock.MagicMock()
2172
2173 obj = Something()
2174 with unittest.mock.patch.object(obj, 'obj_with_bool_func', autospec=True): pass
2175
2176 self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0)
2177
Xtreak9c3f2842019-02-26 03:16:34 +05302178
Michael Foord345266a2012-03-14 12:24:34 -07002179if __name__ == '__main__':
2180 unittest.main()