blob: 0ae498c080829e6e1998b704fe58540fd0fdbe91 [file] [log] [blame]
Michael Foord345266a2012-03-14 12:24:34 -07001# mock.py
2# Test tools for mocking and patching.
Michael Foordc17adf42012-03-14 13:30:29 -07003# Maintained by Michael Foord
4# Backport for other versions of Python available from
5# http://pypi.python.org/pypi/mock
Michael Foord345266a2012-03-14 12:24:34 -07006
7__all__ = (
8 'Mock',
9 'MagicMock',
10 'patch',
11 'sentinel',
12 'DEFAULT',
13 'ANY',
14 'call',
15 'create_autospec',
16 'FILTER_DIR',
17 'NonCallableMock',
18 'NonCallableMagicMock',
19 'mock_open',
20 'PropertyMock',
21)
22
23
24__version__ = '1.0'
25
26
27import inspect
28import pprint
29import sys
30from functools import wraps
31
32
33BaseExceptions = (BaseException,)
34if 'java' in sys.platform:
35 # jython
36 import java
37 BaseExceptions = (BaseException, java.lang.Throwable)
38
39
40FILTER_DIR = True
41
42
43def _is_instance_mock(obj):
44 # can't use isinstance on Mock objects because they override __class__
45 # The base class for all mocks is NonCallableMock
46 return issubclass(type(obj), NonCallableMock)
47
48
49def _is_exception(obj):
50 return (
51 isinstance(obj, BaseExceptions) or
52 isinstance(obj, type) and issubclass(obj, BaseExceptions)
53 )
54
55
56class _slotted(object):
57 __slots__ = ['a']
58
59
60DescriptorTypes = (
61 type(_slotted.a),
62 property,
63)
64
65
66def _getsignature(func, skipfirst, instance=False):
67 if isinstance(func, type) and not instance:
68 try:
69 func = func.__init__
70 except AttributeError:
71 return
72 skipfirst = True
73 elif not isinstance(func, FunctionTypes):
74 # for classes where instance is True we end up here too
75 try:
76 func = func.__call__
77 except AttributeError:
78 return
79
80 try:
81 regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
82 except TypeError:
83 # C function / method, possibly inherited object().__init__
84 return
85
86 # instance methods and classmethods need to lose the self argument
87 if getattr(func, '__self__', None) is not None:
88 regargs = regargs[1:]
89 if skipfirst:
90 # this condition and the above one are never both True - why?
91 regargs = regargs[1:]
92
93 signature = inspect.formatargspec(regargs, varargs, varkwargs, defaults,
94 formatvalue=lambda value: "")
95 return signature[1:-1], func
96
97
98def _check_signature(func, mock, skipfirst, instance=False):
99 if not _callable(func):
100 return
101
102 result = _getsignature(func, skipfirst, instance)
103 if result is None:
104 return
105 signature, func = result
106
107 # can't use self because "self" is common as an argument name
108 # unfortunately even not in the first place
109 src = "lambda _mock_self, %s: None" % signature
110 checksig = eval(src, {})
111 _copy_func_details(func, checksig)
112 type(mock)._mock_check_sig = checksig
113
114
115def _copy_func_details(func, funcopy):
116 funcopy.__name__ = func.__name__
117 funcopy.__doc__ = func.__doc__
118 # we explicitly don't copy func.__dict__ into this copy as it would
119 # expose original attributes that should be mocked
120 funcopy.__module__ = func.__module__
121 funcopy.__defaults__ = func.__defaults__
122 funcopy.__kwdefaults__ = func.__kwdefaults__
123
124
125def _callable(obj):
126 if isinstance(obj, type):
127 return True
128 if getattr(obj, '__call__', None) is not None:
129 return True
130 return False
131
132
133def _is_list(obj):
134 # checks for list or tuples
135 # XXXX badly named!
136 return type(obj) in (list, tuple)
137
138
139def _instance_callable(obj):
140 """Given an object, return True if the object is callable.
141 For classes, return True if instances would be callable."""
142 if not isinstance(obj, type):
143 # already an instance
144 return getattr(obj, '__call__', None) is not None
145
Michael Foorda74b3aa2012-03-14 14:40:22 -0700146 # *could* be broken by a class overriding __mro__ or __dict__ via
147 # a metaclass
148 for base in (obj,) + obj.__mro__:
149 if base.__dict__.get('__call__') is not None:
Michael Foord345266a2012-03-14 12:24:34 -0700150 return True
151 return False
152
153
154def _set_signature(mock, original, instance=False):
155 # creates a function with signature (*args, **kwargs) that delegates to a
156 # mock. It still does signature checking by calling a lambda with the same
157 # signature as the original.
158 if not _callable(original):
159 return
160
161 skipfirst = isinstance(original, type)
162 result = _getsignature(original, skipfirst, instance)
163 if result is None:
164 # was a C function (e.g. object().__init__ ) that can't be mocked
165 return
166
167 signature, func = result
168
169 src = "lambda %s: None" % signature
Michael Foord313f85f2012-03-25 18:16:07 +0100170 checksig = eval(src, {})
Michael Foord345266a2012-03-14 12:24:34 -0700171 _copy_func_details(func, checksig)
172
173 name = original.__name__
174 if not name.isidentifier():
175 name = 'funcopy'
Michael Foord313f85f2012-03-25 18:16:07 +0100176 context = {'_checksig_': checksig, 'mock': mock}
Michael Foord345266a2012-03-14 12:24:34 -0700177 src = """def %s(*args, **kwargs):
Michael Foord313f85f2012-03-25 18:16:07 +0100178 _checksig_(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700179 return mock(*args, **kwargs)""" % name
180 exec (src, context)
181 funcopy = context[name]
182 _setup_func(funcopy, mock)
183 return funcopy
184
185
186def _setup_func(funcopy, mock):
187 funcopy.mock = mock
188
189 # can't use isinstance with mocks
190 if not _is_instance_mock(mock):
191 return
192
193 def assert_called_with(*args, **kwargs):
194 return mock.assert_called_with(*args, **kwargs)
195 def assert_called_once_with(*args, **kwargs):
196 return mock.assert_called_once_with(*args, **kwargs)
197 def assert_has_calls(*args, **kwargs):
198 return mock.assert_has_calls(*args, **kwargs)
199 def assert_any_call(*args, **kwargs):
200 return mock.assert_any_call(*args, **kwargs)
201 def reset_mock():
202 funcopy.method_calls = _CallList()
203 funcopy.mock_calls = _CallList()
204 mock.reset_mock()
205 ret = funcopy.return_value
206 if _is_instance_mock(ret) and not ret is mock:
207 ret.reset_mock()
208
209 funcopy.called = False
210 funcopy.call_count = 0
211 funcopy.call_args = None
212 funcopy.call_args_list = _CallList()
213 funcopy.method_calls = _CallList()
214 funcopy.mock_calls = _CallList()
215
216 funcopy.return_value = mock.return_value
217 funcopy.side_effect = mock.side_effect
218 funcopy._mock_children = mock._mock_children
219
220 funcopy.assert_called_with = assert_called_with
221 funcopy.assert_called_once_with = assert_called_once_with
222 funcopy.assert_has_calls = assert_has_calls
223 funcopy.assert_any_call = assert_any_call
224 funcopy.reset_mock = reset_mock
225
226 mock._mock_delegate = funcopy
227
228
229def _is_magic(name):
230 return '__%s__' % name[2:-2] == name
231
232
233class _SentinelObject(object):
234 "A unique, named, sentinel object."
235 def __init__(self, name):
236 self.name = name
237
238 def __repr__(self):
239 return 'sentinel.%s' % self.name
240
241
242class _Sentinel(object):
243 """Access attributes to return a named object, usable as a sentinel."""
244 def __init__(self):
245 self._sentinels = {}
246
247 def __getattr__(self, name):
248 if name == '__bases__':
249 # Without this help(unittest.mock) raises an exception
250 raise AttributeError
251 return self._sentinels.setdefault(name, _SentinelObject(name))
252
253
254sentinel = _Sentinel()
255
256DEFAULT = sentinel.DEFAULT
257_missing = sentinel.MISSING
258_deleted = sentinel.DELETED
259
260
Michael Foord345266a2012-03-14 12:24:34 -0700261def _copy(value):
262 if type(value) in (dict, list, tuple, set):
263 return type(value)(value)
264 return value
265
266
267_allowed_names = set(
268 [
269 'return_value', '_mock_return_value', 'side_effect',
270 '_mock_side_effect', '_mock_parent', '_mock_new_parent',
271 '_mock_name', '_mock_new_name'
272 ]
273)
274
275
276def _delegating_property(name):
277 _allowed_names.add(name)
278 _the_name = '_mock_' + name
279 def _get(self, name=name, _the_name=_the_name):
280 sig = self._mock_delegate
281 if sig is None:
282 return getattr(self, _the_name)
283 return getattr(sig, name)
284 def _set(self, value, name=name, _the_name=_the_name):
285 sig = self._mock_delegate
286 if sig is None:
287 self.__dict__[_the_name] = value
288 else:
289 setattr(sig, name, value)
290
291 return property(_get, _set)
292
293
294
295class _CallList(list):
296
297 def __contains__(self, value):
298 if not isinstance(value, list):
299 return list.__contains__(self, value)
300 len_value = len(value)
301 len_self = len(self)
302 if len_value > len_self:
303 return False
304
305 for i in range(0, len_self - len_value + 1):
306 sub_list = self[i:i+len_value]
307 if sub_list == value:
308 return True
309 return False
310
311 def __repr__(self):
312 return pprint.pformat(list(self))
313
314
315def _check_and_set_parent(parent, value, name, new_name):
316 if not _is_instance_mock(value):
317 return False
318 if ((value._mock_name or value._mock_new_name) or
319 (value._mock_parent is not None) or
320 (value._mock_new_parent is not None)):
321 return False
322
323 _parent = parent
324 while _parent is not None:
325 # setting a mock (value) as a child or return value of itself
326 # should not modify the mock
327 if _parent is value:
328 return False
329 _parent = _parent._mock_new_parent
330
331 if new_name:
332 value._mock_new_parent = parent
333 value._mock_new_name = new_name
334 if name:
335 value._mock_parent = parent
336 value._mock_name = name
337 return True
338
339
340
341class Base(object):
342 _mock_return_value = DEFAULT
343 _mock_side_effect = None
344 def __init__(self, *args, **kwargs):
345 pass
346
347
348
349class NonCallableMock(Base):
350 """A non-callable version of `Mock`"""
351
352 def __new__(cls, *args, **kw):
353 # every instance has its own class
354 # so we can create magic methods on the
355 # class without stomping on other mocks
356 new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
357 instance = object.__new__(new)
358 return instance
359
360
361 def __init__(
362 self, spec=None, wraps=None, name=None, spec_set=None,
363 parent=None, _spec_state=None, _new_name='', _new_parent=None,
364 **kwargs
365 ):
366 if _new_parent is None:
367 _new_parent = parent
368
369 __dict__ = self.__dict__
370 __dict__['_mock_parent'] = parent
371 __dict__['_mock_name'] = name
372 __dict__['_mock_new_name'] = _new_name
373 __dict__['_mock_new_parent'] = _new_parent
374
375 if spec_set is not None:
376 spec = spec_set
377 spec_set = True
378
379 self._mock_add_spec(spec, spec_set)
380
381 __dict__['_mock_children'] = {}
382 __dict__['_mock_wraps'] = wraps
383 __dict__['_mock_delegate'] = None
384
385 __dict__['_mock_called'] = False
386 __dict__['_mock_call_args'] = None
387 __dict__['_mock_call_count'] = 0
388 __dict__['_mock_call_args_list'] = _CallList()
389 __dict__['_mock_mock_calls'] = _CallList()
390
391 __dict__['method_calls'] = _CallList()
392
393 if kwargs:
394 self.configure_mock(**kwargs)
395
396 super(NonCallableMock, self).__init__(
397 spec, wraps, name, spec_set, parent,
398 _spec_state
399 )
400
401
402 def attach_mock(self, mock, attribute):
403 """
404 Attach a mock as an attribute of this one, replacing its name and
405 parent. Calls to the attached mock will be recorded in the
406 `method_calls` and `mock_calls` attributes of this one."""
407 mock._mock_parent = None
408 mock._mock_new_parent = None
409 mock._mock_name = ''
410 mock._mock_new_name = None
411
412 setattr(self, attribute, mock)
413
414
415 def mock_add_spec(self, spec, spec_set=False):
416 """Add a spec to a mock. `spec` can either be an object or a
417 list of strings. Only attributes on the `spec` can be fetched as
418 attributes from the mock.
419
420 If `spec_set` is True then only attributes on the spec can be set."""
421 self._mock_add_spec(spec, spec_set)
422
423
424 def _mock_add_spec(self, spec, spec_set):
425 _spec_class = None
426
427 if spec is not None and not _is_list(spec):
428 if isinstance(spec, type):
429 _spec_class = spec
430 else:
431 _spec_class = _get_class(spec)
432
433 spec = dir(spec)
434
435 __dict__ = self.__dict__
436 __dict__['_spec_class'] = _spec_class
437 __dict__['_spec_set'] = spec_set
438 __dict__['_mock_methods'] = spec
439
440
441 def __get_return_value(self):
442 ret = self._mock_return_value
443 if self._mock_delegate is not None:
444 ret = self._mock_delegate.return_value
445
446 if ret is DEFAULT:
447 ret = self._get_child_mock(
448 _new_parent=self, _new_name='()'
449 )
450 self.return_value = ret
451 return ret
452
453
454 def __set_return_value(self, value):
455 if self._mock_delegate is not None:
456 self._mock_delegate.return_value = value
457 else:
458 self._mock_return_value = value
459 _check_and_set_parent(self, value, None, '()')
460
461 __return_value_doc = "The value to be returned when the mock is called."
462 return_value = property(__get_return_value, __set_return_value,
463 __return_value_doc)
464
465
466 @property
467 def __class__(self):
468 if self._spec_class is None:
469 return type(self)
470 return self._spec_class
471
472 called = _delegating_property('called')
473 call_count = _delegating_property('call_count')
474 call_args = _delegating_property('call_args')
475 call_args_list = _delegating_property('call_args_list')
476 mock_calls = _delegating_property('mock_calls')
477
478
479 def __get_side_effect(self):
480 delegated = self._mock_delegate
481 if delegated is None:
482 return self._mock_side_effect
483 return delegated.side_effect
484
485 def __set_side_effect(self, value):
486 value = _try_iter(value)
487 delegated = self._mock_delegate
488 if delegated is None:
489 self._mock_side_effect = value
490 else:
491 delegated.side_effect = value
492
493 side_effect = property(__get_side_effect, __set_side_effect)
494
495
496 def reset_mock(self):
497 "Restore the mock object to its initial state."
498 self.called = False
499 self.call_args = None
500 self.call_count = 0
501 self.mock_calls = _CallList()
502 self.call_args_list = _CallList()
503 self.method_calls = _CallList()
504
505 for child in self._mock_children.values():
506 child.reset_mock()
507
508 ret = self._mock_return_value
509 if _is_instance_mock(ret) and ret is not self:
510 ret.reset_mock()
511
512
513 def configure_mock(self, **kwargs):
514 """Set attributes on the mock through keyword arguments.
515
516 Attributes plus return values and side effects can be set on child
517 mocks using standard dot notation and unpacking a dictionary in the
518 method call:
519
520 >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
521 >>> mock.configure_mock(**attrs)"""
522 for arg, val in sorted(kwargs.items(),
523 # we sort on the number of dots so that
524 # attributes are set before we set attributes on
525 # attributes
526 key=lambda entry: entry[0].count('.')):
527 args = arg.split('.')
528 final = args.pop()
529 obj = self
530 for entry in args:
531 obj = getattr(obj, entry)
532 setattr(obj, final, val)
533
534
535 def __getattr__(self, name):
536 if name == '_mock_methods':
537 raise AttributeError(name)
538 elif self._mock_methods is not None:
539 if name not in self._mock_methods or name in _all_magics:
540 raise AttributeError("Mock object has no attribute %r" % name)
541 elif _is_magic(name):
542 raise AttributeError(name)
543
544 result = self._mock_children.get(name)
545 if result is _deleted:
546 raise AttributeError(name)
547 elif result is None:
548 wraps = None
549 if self._mock_wraps is not None:
550 # XXXX should we get the attribute without triggering code
551 # execution?
552 wraps = getattr(self._mock_wraps, name)
553
554 result = self._get_child_mock(
555 parent=self, name=name, wraps=wraps, _new_name=name,
556 _new_parent=self
557 )
558 self._mock_children[name] = result
559
560 elif isinstance(result, _SpecState):
561 result = create_autospec(
562 result.spec, result.spec_set, result.instance,
563 result.parent, result.name
564 )
565 self._mock_children[name] = result
566
567 return result
568
569
570 def __repr__(self):
571 _name_list = [self._mock_new_name]
572 _parent = self._mock_new_parent
573 last = self
574
575 dot = '.'
576 if _name_list == ['()']:
577 dot = ''
578 seen = set()
579 while _parent is not None:
580 last = _parent
581
582 _name_list.append(_parent._mock_new_name + dot)
583 dot = '.'
584 if _parent._mock_new_name == '()':
585 dot = ''
586
587 _parent = _parent._mock_new_parent
588
589 # use ids here so as not to call __hash__ on the mocks
590 if id(_parent) in seen:
591 break
592 seen.add(id(_parent))
593
594 _name_list = list(reversed(_name_list))
595 _first = last._mock_name or 'mock'
596 if len(_name_list) > 1:
597 if _name_list[1] not in ('()', '().'):
598 _first += '.'
599 _name_list[0] = _first
600 name = ''.join(_name_list)
601
602 name_string = ''
603 if name not in ('mock', 'mock.'):
604 name_string = ' name=%r' % name
605
606 spec_string = ''
607 if self._spec_class is not None:
608 spec_string = ' spec=%r'
609 if self._spec_set:
610 spec_string = ' spec_set=%r'
611 spec_string = spec_string % self._spec_class.__name__
612 return "<%s%s%s id='%s'>" % (
613 type(self).__name__,
614 name_string,
615 spec_string,
616 id(self)
617 )
618
619
620 def __dir__(self):
Michael Foordd7c65e22012-03-14 14:56:54 -0700621 """Filter the output of `dir(mock)` to only useful members."""
Michael Foord313f85f2012-03-25 18:16:07 +0100622 if not FILTER_DIR:
623 return object.__dir__(self)
624
Michael Foord345266a2012-03-14 12:24:34 -0700625 extras = self._mock_methods or []
626 from_type = dir(type(self))
627 from_dict = list(self.__dict__)
628
Michael Foord313f85f2012-03-25 18:16:07 +0100629 from_type = [e for e in from_type if not e.startswith('_')]
630 from_dict = [e for e in from_dict if not e.startswith('_') or
631 _is_magic(e)]
Michael Foord345266a2012-03-14 12:24:34 -0700632 return sorted(set(extras + from_type + from_dict +
633 list(self._mock_children)))
634
635
636 def __setattr__(self, name, value):
637 if name in _allowed_names:
638 # property setters go through here
639 return object.__setattr__(self, name, value)
640 elif (self._spec_set and self._mock_methods is not None and
641 name not in self._mock_methods and
642 name not in self.__dict__):
643 raise AttributeError("Mock object has no attribute '%s'" % name)
644 elif name in _unsupported_magics:
645 msg = 'Attempting to set unsupported magic method %r.' % name
646 raise AttributeError(msg)
647 elif name in _all_magics:
648 if self._mock_methods is not None and name not in self._mock_methods:
649 raise AttributeError("Mock object has no attribute '%s'" % name)
650
651 if not _is_instance_mock(value):
652 setattr(type(self), name, _get_method(name, value))
653 original = value
654 value = lambda *args, **kw: original(self, *args, **kw)
655 else:
656 # only set _new_name and not name so that mock_calls is tracked
657 # but not method calls
658 _check_and_set_parent(self, value, None, name)
659 setattr(type(self), name, value)
660 elif name == '__class__':
661 self._spec_class = value
662 return
663 else:
664 if _check_and_set_parent(self, value, name, name):
665 self._mock_children[name] = value
666 return object.__setattr__(self, name, value)
667
668
669 def __delattr__(self, name):
670 if name in _all_magics and name in type(self).__dict__:
671 delattr(type(self), name)
672 if name not in self.__dict__:
673 # for magic methods that are still MagicProxy objects and
674 # not set on the instance itself
675 return
676
677 if name in self.__dict__:
678 object.__delattr__(self, name)
679
680 obj = self._mock_children.get(name, _missing)
681 if obj is _deleted:
682 raise AttributeError(name)
683 if obj is not _missing:
684 del self._mock_children[name]
685 self._mock_children[name] = _deleted
686
687
688
689 def _format_mock_call_signature(self, args, kwargs):
690 name = self._mock_name or 'mock'
691 return _format_call_signature(name, args, kwargs)
692
693
694 def _format_mock_failure_message(self, args, kwargs):
695 message = 'Expected call: %s\nActual call: %s'
696 expected_string = self._format_mock_call_signature(args, kwargs)
697 call_args = self.call_args
698 if len(call_args) == 3:
699 call_args = call_args[1:]
700 actual_string = self._format_mock_call_signature(*call_args)
701 return message % (expected_string, actual_string)
702
703
704 def assert_called_with(_mock_self, *args, **kwargs):
705 """assert that the mock was called with the specified arguments.
706
707 Raises an AssertionError if the args and keyword args passed in are
708 different to the last call to the mock."""
709 self = _mock_self
710 if self.call_args is None:
711 expected = self._format_mock_call_signature(args, kwargs)
712 raise AssertionError('Expected call: %s\nNot called' % (expected,))
713
714 if self.call_args != (args, kwargs):
715 msg = self._format_mock_failure_message(args, kwargs)
716 raise AssertionError(msg)
717
718
719 def assert_called_once_with(_mock_self, *args, **kwargs):
720 """assert that the mock was called exactly once and with the specified
721 arguments."""
722 self = _mock_self
723 if not self.call_count == 1:
724 msg = ("Expected to be called once. Called %s times." %
725 self.call_count)
726 raise AssertionError(msg)
727 return self.assert_called_with(*args, **kwargs)
728
729
730 def assert_has_calls(self, calls, any_order=False):
731 """assert the mock has been called with the specified calls.
732 The `mock_calls` list is checked for the calls.
733
734 If `any_order` is False (the default) then the calls must be
735 sequential. There can be extra calls before or after the
736 specified calls.
737
738 If `any_order` is True then the calls can be in any order, but
739 they must all appear in `mock_calls`."""
740 if not any_order:
741 if calls not in self.mock_calls:
742 raise AssertionError(
743 'Calls not found.\nExpected: %r\n'
744 'Actual: %r' % (calls, self.mock_calls)
745 )
746 return
747
748 all_calls = list(self.mock_calls)
749
750 not_found = []
751 for kall in calls:
752 try:
753 all_calls.remove(kall)
754 except ValueError:
755 not_found.append(kall)
756 if not_found:
757 raise AssertionError(
758 '%r not all found in call list' % (tuple(not_found),)
759 )
760
761
762 def assert_any_call(self, *args, **kwargs):
763 """assert the mock has been called with the specified arguments.
764
765 The assert passes if the mock has *ever* been called, unlike
766 `assert_called_with` and `assert_called_once_with` that only pass if
767 the call is the most recent one."""
768 kall = call(*args, **kwargs)
769 if kall not in self.call_args_list:
770 expected_string = self._format_mock_call_signature(args, kwargs)
771 raise AssertionError(
772 '%s call not found' % expected_string
773 )
774
775
776 def _get_child_mock(self, **kw):
777 """Create the child mocks for attributes and return value.
778 By default child mocks will be the same type as the parent.
779 Subclasses of Mock may want to override this to customize the way
780 child mocks are made.
781
782 For non-callable mocks the callable variant will be used (rather than
783 any custom subclass)."""
784 _type = type(self)
785 if not issubclass(_type, CallableMixin):
786 if issubclass(_type, NonCallableMagicMock):
787 klass = MagicMock
788 elif issubclass(_type, NonCallableMock) :
789 klass = Mock
790 else:
791 klass = _type.__mro__[1]
792 return klass(**kw)
793
794
795
796def _try_iter(obj):
797 if obj is None:
798 return obj
799 if _is_exception(obj):
800 return obj
801 if _callable(obj):
802 return obj
803 try:
804 return iter(obj)
805 except TypeError:
806 # XXXX backwards compatibility
807 # but this will blow up on first call - so maybe we should fail early?
808 return obj
809
810
811
812class CallableMixin(Base):
813
814 def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
815 wraps=None, name=None, spec_set=None, parent=None,
816 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
817 self.__dict__['_mock_return_value'] = return_value
818
819 super(CallableMixin, self).__init__(
820 spec, wraps, name, spec_set, parent,
821 _spec_state, _new_name, _new_parent, **kwargs
822 )
823
824 self.side_effect = side_effect
825
826
827 def _mock_check_sig(self, *args, **kwargs):
828 # stub method that can be replaced with one with a specific signature
829 pass
830
831
832 def __call__(_mock_self, *args, **kwargs):
833 # can't use self in-case a function / method we are mocking uses self
834 # in the signature
835 _mock_self._mock_check_sig(*args, **kwargs)
836 return _mock_self._mock_call(*args, **kwargs)
837
838
839 def _mock_call(_mock_self, *args, **kwargs):
840 self = _mock_self
841 self.called = True
842 self.call_count += 1
843 self.call_args = _Call((args, kwargs), two=True)
844 self.call_args_list.append(_Call((args, kwargs), two=True))
845
846 _new_name = self._mock_new_name
847 _new_parent = self._mock_new_parent
848 self.mock_calls.append(_Call(('', args, kwargs)))
849
850 seen = set()
851 skip_next_dot = _new_name == '()'
852 do_method_calls = self._mock_parent is not None
853 name = self._mock_name
854 while _new_parent is not None:
855 this_mock_call = _Call((_new_name, args, kwargs))
856 if _new_parent._mock_new_name:
857 dot = '.'
858 if skip_next_dot:
859 dot = ''
860
861 skip_next_dot = False
862 if _new_parent._mock_new_name == '()':
863 skip_next_dot = True
864
865 _new_name = _new_parent._mock_new_name + dot + _new_name
866
867 if do_method_calls:
868 if _new_name == name:
869 this_method_call = this_mock_call
870 else:
871 this_method_call = _Call((name, args, kwargs))
872 _new_parent.method_calls.append(this_method_call)
873
874 do_method_calls = _new_parent._mock_parent is not None
875 if do_method_calls:
876 name = _new_parent._mock_name + '.' + name
877
878 _new_parent.mock_calls.append(this_mock_call)
879 _new_parent = _new_parent._mock_new_parent
880
881 # use ids here so as not to call __hash__ on the mocks
882 _new_parent_id = id(_new_parent)
883 if _new_parent_id in seen:
884 break
885 seen.add(_new_parent_id)
886
887 ret_val = DEFAULT
888 effect = self.side_effect
889 if effect is not None:
890 if _is_exception(effect):
891 raise effect
892
893 if not _callable(effect):
894 return next(effect)
895
896 ret_val = effect(*args, **kwargs)
897 if ret_val is DEFAULT:
898 ret_val = self.return_value
899
900 if (self._mock_wraps is not None and
901 self._mock_return_value is DEFAULT):
902 return self._mock_wraps(*args, **kwargs)
903 if ret_val is DEFAULT:
904 ret_val = self.return_value
905 return ret_val
906
907
908
909class Mock(CallableMixin, NonCallableMock):
910 """
911 Create a new `Mock` object. `Mock` takes several optional arguments
912 that specify the behaviour of the Mock object:
913
914 * `spec`: This can be either a list of strings or an existing object (a
915 class or instance) that acts as the specification for the mock object. If
916 you pass in an object then a list of strings is formed by calling dir on
917 the object (excluding unsupported magic attributes and methods). Accessing
918 any attribute not in this list will raise an `AttributeError`.
919
920 If `spec` is an object (rather than a list of strings) then
921 `mock.__class__` returns the class of the spec object. This allows mocks
922 to pass `isinstance` tests.
923
924 * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
925 or get an attribute on the mock that isn't on the object passed as
926 `spec_set` will raise an `AttributeError`.
927
928 * `side_effect`: A function to be called whenever the Mock is called. See
929 the `side_effect` attribute. Useful for raising exceptions or
930 dynamically changing return values. The function is called with the same
931 arguments as the mock, and unless it returns `DEFAULT`, the return
932 value of this function is used as the return value.
933
934 Alternatively `side_effect` can be an exception class or instance. In
935 this case the exception will be raised when the mock is called.
936
937 If `side_effect` is an iterable then each call to the mock will return
938 the next value from the iterable.
939
940 * `return_value`: The value returned when the mock is called. By default
941 this is a new Mock (created on first access). See the
942 `return_value` attribute.
943
944 * `wraps`: Item for the mock object to wrap. If `wraps` is not None
945 then calling the Mock will pass the call through to the wrapped object
946 (returning the real result and ignoring `return_value`). Attribute
947 access on the mock will return a Mock object that wraps the corresponding
948 attribute of the wrapped object (so attempting to access an attribute that
949 doesn't exist will raise an `AttributeError`).
950
951 If the mock has an explicit `return_value` set then calls are not passed
952 to the wrapped object and the `return_value` is returned instead.
953
954 * `name`: If the mock has a name then it will be used in the repr of the
955 mock. This can be useful for debugging. The name is propagated to child
956 mocks.
957
958 Mocks can also be called with arbitrary keyword arguments. These will be
959 used to set attributes on the mock after it is created.
960 """
961
962
963
964def _dot_lookup(thing, comp, import_path):
965 try:
966 return getattr(thing, comp)
967 except AttributeError:
968 __import__(import_path)
969 return getattr(thing, comp)
970
971
972def _importer(target):
973 components = target.split('.')
974 import_path = components.pop(0)
975 thing = __import__(import_path)
976
977 for comp in components:
978 import_path += ".%s" % comp
979 thing = _dot_lookup(thing, comp, import_path)
980 return thing
981
982
983def _is_started(patcher):
984 # XXXX horrible
985 return hasattr(patcher, 'is_local')
986
987
988class _patch(object):
989
990 attribute_name = None
991
992 def __init__(
993 self, getter, attribute, new, spec, create,
994 spec_set, autospec, new_callable, kwargs
995 ):
996 if new_callable is not None:
997 if new is not DEFAULT:
998 raise ValueError(
999 "Cannot use 'new' and 'new_callable' together"
1000 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001001 if autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001002 raise ValueError(
1003 "Cannot use 'autospec' and 'new_callable' together"
1004 )
1005
1006 self.getter = getter
1007 self.attribute = attribute
1008 self.new = new
1009 self.new_callable = new_callable
1010 self.spec = spec
1011 self.create = create
1012 self.has_local = False
1013 self.spec_set = spec_set
1014 self.autospec = autospec
1015 self.kwargs = kwargs
1016 self.additional_patchers = []
1017
1018
1019 def copy(self):
1020 patcher = _patch(
1021 self.getter, self.attribute, self.new, self.spec,
1022 self.create, self.spec_set,
1023 self.autospec, self.new_callable, self.kwargs
1024 )
1025 patcher.attribute_name = self.attribute_name
1026 patcher.additional_patchers = [
1027 p.copy() for p in self.additional_patchers
1028 ]
1029 return patcher
1030
1031
1032 def __call__(self, func):
1033 if isinstance(func, type):
1034 return self.decorate_class(func)
1035 return self.decorate_callable(func)
1036
1037
1038 def decorate_class(self, klass):
1039 for attr in dir(klass):
1040 if not attr.startswith(patch.TEST_PREFIX):
1041 continue
1042
1043 attr_value = getattr(klass, attr)
1044 if not hasattr(attr_value, "__call__"):
1045 continue
1046
1047 patcher = self.copy()
1048 setattr(klass, attr, patcher(attr_value))
1049 return klass
1050
1051
1052 def decorate_callable(self, func):
1053 if hasattr(func, 'patchings'):
1054 func.patchings.append(self)
1055 return func
1056
1057 @wraps(func)
1058 def patched(*args, **keywargs):
Michael Foord345266a2012-03-14 12:24:34 -07001059 extra_args = []
1060 entered_patchers = []
1061
Michael Foord50a8c0e2012-03-25 18:57:58 +01001062 exc_info = tuple()
Michael Foord345266a2012-03-14 12:24:34 -07001063 try:
Michael Foordd7c65e22012-03-14 14:56:54 -07001064 for patching in patched.patchings:
1065 arg = patching.__enter__()
1066 entered_patchers.append(patching)
1067 if patching.attribute_name is not None:
1068 keywargs.update(arg)
1069 elif patching.new is DEFAULT:
1070 extra_args.append(arg)
Michael Foord345266a2012-03-14 12:24:34 -07001071
Michael Foordd7c65e22012-03-14 14:56:54 -07001072 args += tuple(extra_args)
1073 return func(*args, **keywargs)
1074 except:
1075 if (patching not in entered_patchers and
1076 _is_started(patching)):
1077 # the patcher may have been started, but an exception
1078 # raised whilst entering one of its additional_patchers
1079 entered_patchers.append(patching)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001080 # Pass the exception to __exit__
1081 exc_info = sys.exc_info()
Michael Foordd7c65e22012-03-14 14:56:54 -07001082 # re-raise the exception
1083 raise
Michael Foord345266a2012-03-14 12:24:34 -07001084 finally:
1085 for patching in reversed(entered_patchers):
Michael Foord50a8c0e2012-03-25 18:57:58 +01001086 patching.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001087
1088 patched.patchings = [self]
Michael Foord345266a2012-03-14 12:24:34 -07001089 return patched
1090
1091
1092 def get_original(self):
1093 target = self.getter()
1094 name = self.attribute
1095
1096 original = DEFAULT
1097 local = False
1098
1099 try:
1100 original = target.__dict__[name]
1101 except (AttributeError, KeyError):
1102 original = getattr(target, name, DEFAULT)
1103 else:
1104 local = True
1105
1106 if not self.create and original is DEFAULT:
1107 raise AttributeError(
1108 "%s does not have the attribute %r" % (target, name)
1109 )
1110 return original, local
1111
1112
1113 def __enter__(self):
1114 """Perform the patch."""
1115 new, spec, spec_set = self.new, self.spec, self.spec_set
1116 autospec, kwargs = self.autospec, self.kwargs
1117 new_callable = self.new_callable
1118 self.target = self.getter()
1119
Michael Foord50a8c0e2012-03-25 18:57:58 +01001120 # normalise False to None
1121 if spec is False:
1122 spec = None
1123 if spec_set is False:
1124 spec_set = None
1125 if autospec is False:
1126 autospec = None
1127
1128 if spec is not None and autospec is not None:
1129 raise TypeError("Can't specify spec and autospec")
1130 if ((spec is not None or autospec is not None) and
1131 spec_set not in (True, None)):
1132 raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1133
Michael Foord345266a2012-03-14 12:24:34 -07001134 original, local = self.get_original()
1135
Michael Foord50a8c0e2012-03-25 18:57:58 +01001136 if new is DEFAULT and autospec is None:
Michael Foord345266a2012-03-14 12:24:34 -07001137 inherit = False
Michael Foord50a8c0e2012-03-25 18:57:58 +01001138 if spec is True:
Michael Foord345266a2012-03-14 12:24:34 -07001139 # set spec to the object we are replacing
1140 spec = original
Michael Foord50a8c0e2012-03-25 18:57:58 +01001141 if spec_set is True:
1142 spec_set = original
1143 spec = None
1144 elif spec is not None:
1145 if spec_set is True:
1146 spec_set = spec
1147 spec = None
1148 elif spec_set is True:
1149 spec_set = original
Michael Foord345266a2012-03-14 12:24:34 -07001150
Michael Foord50a8c0e2012-03-25 18:57:58 +01001151 if spec is not None or spec_set is not None:
1152 if original is DEFAULT:
1153 raise TypeError("Can't use 'spec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001154 if isinstance(original, type):
1155 # If we're patching out a class and there is a spec
1156 inherit = True
1157
1158 Klass = MagicMock
1159 _kwargs = {}
1160 if new_callable is not None:
1161 Klass = new_callable
Michael Foord50a8c0e2012-03-25 18:57:58 +01001162 elif spec is not None or spec_set is not None:
Michael Foorde58a5622012-03-25 19:53:18 +01001163 this_spec = spec
1164 if spec_set is not None:
1165 this_spec = spec_set
1166 if _is_list(this_spec):
1167 not_callable = '__call__' not in this_spec
1168 else:
1169 not_callable = not callable(this_spec)
1170 if not_callable:
Michael Foord345266a2012-03-14 12:24:34 -07001171 Klass = NonCallableMagicMock
1172
1173 if spec is not None:
1174 _kwargs['spec'] = spec
1175 if spec_set is not None:
1176 _kwargs['spec_set'] = spec_set
1177
1178 # add a name to mocks
1179 if (isinstance(Klass, type) and
1180 issubclass(Klass, NonCallableMock) and self.attribute):
1181 _kwargs['name'] = self.attribute
1182
1183 _kwargs.update(kwargs)
1184 new = Klass(**_kwargs)
1185
1186 if inherit and _is_instance_mock(new):
1187 # we can only tell if the instance should be callable if the
1188 # spec is not a list
Michael Foord50a8c0e2012-03-25 18:57:58 +01001189 this_spec = spec
1190 if spec_set is not None:
1191 this_spec = spec_set
1192 if (not _is_list(this_spec) and not
1193 _instance_callable(this_spec)):
Michael Foord345266a2012-03-14 12:24:34 -07001194 Klass = NonCallableMagicMock
1195
1196 _kwargs.pop('name')
1197 new.return_value = Klass(_new_parent=new, _new_name='()',
1198 **_kwargs)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001199 elif autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001200 # spec is ignored, new *must* be default, spec_set is treated
1201 # as a boolean. Should we check spec is not None and that spec_set
1202 # is a bool?
1203 if new is not DEFAULT:
1204 raise TypeError(
1205 "autospec creates the mock for you. Can't specify "
1206 "autospec and new."
1207 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001208 if original is DEFAULT:
Michael Foord99254732012-03-25 19:07:33 +01001209 raise TypeError("Can't use 'autospec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001210 spec_set = bool(spec_set)
1211 if autospec is True:
1212 autospec = original
1213
1214 new = create_autospec(autospec, spec_set=spec_set,
1215 _name=self.attribute, **kwargs)
1216 elif kwargs:
1217 # can't set keyword args when we aren't creating the mock
1218 # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1219 raise TypeError("Can't pass kwargs to a mock we aren't creating")
1220
1221 new_attr = new
1222
1223 self.temp_original = original
1224 self.is_local = local
1225 setattr(self.target, self.attribute, new_attr)
1226 if self.attribute_name is not None:
1227 extra_args = {}
1228 if self.new is DEFAULT:
1229 extra_args[self.attribute_name] = new
1230 for patching in self.additional_patchers:
1231 arg = patching.__enter__()
1232 if patching.new is DEFAULT:
1233 extra_args.update(arg)
1234 return extra_args
1235
1236 return new
1237
1238
Michael Foord50a8c0e2012-03-25 18:57:58 +01001239 def __exit__(self, *exc_info):
Michael Foord345266a2012-03-14 12:24:34 -07001240 """Undo the patch."""
1241 if not _is_started(self):
1242 raise RuntimeError('stop called on unstarted patcher')
1243
1244 if self.is_local and self.temp_original is not DEFAULT:
1245 setattr(self.target, self.attribute, self.temp_original)
1246 else:
1247 delattr(self.target, self.attribute)
1248 if not self.create and not hasattr(self.target, self.attribute):
1249 # needed for proxy objects like django settings
1250 setattr(self.target, self.attribute, self.temp_original)
1251
1252 del self.temp_original
1253 del self.is_local
1254 del self.target
1255 for patcher in reversed(self.additional_patchers):
1256 if _is_started(patcher):
Michael Foord50a8c0e2012-03-25 18:57:58 +01001257 patcher.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001258
1259 start = __enter__
1260 stop = __exit__
1261
1262
1263
1264def _get_target(target):
1265 try:
1266 target, attribute = target.rsplit('.', 1)
1267 except (TypeError, ValueError):
1268 raise TypeError("Need a valid target to patch. You supplied: %r" %
1269 (target,))
1270 getter = lambda: _importer(target)
1271 return getter, attribute
1272
1273
1274def _patch_object(
1275 target, attribute, new=DEFAULT, spec=None,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001276 create=False, spec_set=None, autospec=None,
Michael Foord345266a2012-03-14 12:24:34 -07001277 new_callable=None, **kwargs
1278 ):
1279 """
Michael Foord345266a2012-03-14 12:24:34 -07001280 patch the named member (`attribute`) on an object (`target`) with a mock
1281 object.
1282
1283 `patch.object` can be used as a decorator, class decorator or a context
1284 manager. Arguments `new`, `spec`, `create`, `spec_set`,
1285 `autospec` and `new_callable` have the same meaning as for `patch`. Like
1286 `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1287 the mock object it creates.
1288
1289 When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1290 for choosing which methods to wrap.
1291 """
1292 getter = lambda: target
1293 return _patch(
1294 getter, attribute, new, spec, create,
1295 spec_set, autospec, new_callable, kwargs
1296 )
1297
1298
Michael Foord50a8c0e2012-03-25 18:57:58 +01001299def _patch_multiple(target, spec=None, create=False, spec_set=None,
1300 autospec=None, new_callable=None, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001301 """Perform multiple patches in a single call. It takes the object to be
1302 patched (either as an object or a string to fetch the object by importing)
1303 and keyword arguments for the patches::
1304
1305 with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1306 ...
1307
1308 Use `DEFAULT` as the value if you want `patch.multiple` to create
1309 mocks for you. In this case the created mocks are passed into a decorated
1310 function by keyword, and a dictionary is returned when `patch.multiple` is
1311 used as a context manager.
1312
1313 `patch.multiple` can be used as a decorator, class decorator or a context
1314 manager. The arguments `spec`, `spec_set`, `create`,
1315 `autospec` and `new_callable` have the same meaning as for `patch`. These
1316 arguments will be applied to *all* patches done by `patch.multiple`.
1317
1318 When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1319 for choosing which methods to wrap.
1320 """
1321 if type(target) is str:
1322 getter = lambda: _importer(target)
1323 else:
1324 getter = lambda: target
1325
1326 if not kwargs:
1327 raise ValueError(
1328 'Must supply at least one keyword argument with patch.multiple'
1329 )
1330 # need to wrap in a list for python 3, where items is a view
1331 items = list(kwargs.items())
1332 attribute, new = items[0]
1333 patcher = _patch(
1334 getter, attribute, new, spec, create, spec_set,
1335 autospec, new_callable, {}
1336 )
1337 patcher.attribute_name = attribute
1338 for attribute, new in items[1:]:
1339 this_patcher = _patch(
1340 getter, attribute, new, spec, create, spec_set,
1341 autospec, new_callable, {}
1342 )
1343 this_patcher.attribute_name = attribute
1344 patcher.additional_patchers.append(this_patcher)
1345 return patcher
1346
1347
1348def patch(
1349 target, new=DEFAULT, spec=None, create=False,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001350 spec_set=None, autospec=None, new_callable=None, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -07001351 ):
1352 """
1353 `patch` acts as a function decorator, class decorator or a context
Michael Foord54b3db82012-03-28 15:08:08 +01001354
1355 `patch` acts as a function decorator, class decorator or a context
Michael Foord345266a2012-03-14 12:24:34 -07001356 manager. Inside the body of the function or with statement, the `target`
Michael Foord54b3db82012-03-28 15:08:08 +01001357 is patched with a `new` object. When the function/with statement exits
1358 the patch is undone.
Michael Foord345266a2012-03-14 12:24:34 -07001359
Michael Foord54b3db82012-03-28 15:08:08 +01001360 If `new` is omitted, then the target is replaced with a
1361 `MagicMock`. If `patch` is used as a decorator and `new` is
1362 omitted, the created mock is passed in as an extra argument to the
1363 decorated function. If `patch` is used as a context manager the created
1364 mock is returned by the context manager.
Michael Foord345266a2012-03-14 12:24:34 -07001365
Michael Foord54b3db82012-03-28 15:08:08 +01001366 `target` should be a string in the form `'package.module.ClassName'`. The
1367 `target` is imported and the specified object replaced with the `new`
1368 object, so the `target` must be importable from the environment you are
1369 calling `patch` from. The target is imported when the decorated function
1370 is executed, not at decoration time.
Michael Foord345266a2012-03-14 12:24:34 -07001371
1372 The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1373 if patch is creating one for you.
1374
1375 In addition you can pass `spec=True` or `spec_set=True`, which causes
1376 patch to pass in the object being mocked as the spec/spec_set object.
1377
1378 `new_callable` allows you to specify a different class, or callable object,
1379 that will be called to create the `new` object. By default `MagicMock` is
1380 used.
1381
1382 A more powerful form of `spec` is `autospec`. If you set `autospec=True`
1383 then the mock with be created with a spec from the object being replaced.
1384 All attributes of the mock will also have the spec of the corresponding
1385 attribute of the object being replaced. Methods and functions being
1386 mocked will have their arguments checked and will raise a `TypeError` if
1387 they are called with the wrong signature. For mocks replacing a class,
1388 their return value (the 'instance') will have the same spec as the class.
1389
1390 Instead of `autospec=True` you can pass `autospec=some_object` to use an
1391 arbitrary object as the spec instead of the one being replaced.
1392
1393 By default `patch` will fail to replace attributes that don't exist. If
1394 you pass in `create=True`, and the attribute doesn't exist, patch will
1395 create the attribute for you when the patched function is called, and
1396 delete it again afterwards. This is useful for writing tests against
1397 attributes that your production code creates at runtime. It is off by by
1398 default because it can be dangerous. With it switched on you can write
1399 passing tests against APIs that don't actually exist!
1400
1401 Patch can be used as a `TestCase` class decorator. It works by
1402 decorating each test method in the class. This reduces the boilerplate
1403 code when your test methods share a common patchings set. `patch` finds
1404 tests by looking for method names that start with `patch.TEST_PREFIX`.
1405 By default this is `test`, which matches the way `unittest` finds tests.
1406 You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1407
1408 Patch can be used as a context manager, with the with statement. Here the
1409 patching applies to the indented block after the with statement. If you
1410 use "as" then the patched object will be bound to the name after the
1411 "as"; very useful if `patch` is creating a mock object for you.
1412
1413 `patch` takes arbitrary keyword arguments. These will be passed to
1414 the `Mock` (or `new_callable`) on construction.
1415
1416 `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1417 available for alternate use-cases.
1418 """
1419 getter, attribute = _get_target(target)
1420 return _patch(
1421 getter, attribute, new, spec, create,
1422 spec_set, autospec, new_callable, kwargs
1423 )
1424
1425
1426class _patch_dict(object):
1427 """
1428 Patch a dictionary, or dictionary like object, and restore the dictionary
1429 to its original state after the test.
1430
1431 `in_dict` can be a dictionary or a mapping like container. If it is a
1432 mapping then it must at least support getting, setting and deleting items
1433 plus iterating over keys.
1434
1435 `in_dict` can also be a string specifying the name of the dictionary, which
1436 will then be fetched by importing it.
1437
1438 `values` can be a dictionary of values to set in the dictionary. `values`
1439 can also be an iterable of `(key, value)` pairs.
1440
1441 If `clear` is True then the dictionary will be cleared before the new
1442 values are set.
1443
1444 `patch.dict` can also be called with arbitrary keyword arguments to set
1445 values in the dictionary::
1446
1447 with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1448 ...
1449
1450 `patch.dict` can be used as a context manager, decorator or class
1451 decorator. When used as a class decorator `patch.dict` honours
1452 `patch.TEST_PREFIX` for choosing which methods to wrap.
1453 """
1454
1455 def __init__(self, in_dict, values=(), clear=False, **kwargs):
1456 if isinstance(in_dict, str):
1457 in_dict = _importer(in_dict)
1458 self.in_dict = in_dict
1459 # support any argument supported by dict(...) constructor
1460 self.values = dict(values)
1461 self.values.update(kwargs)
1462 self.clear = clear
1463 self._original = None
1464
1465
1466 def __call__(self, f):
1467 if isinstance(f, type):
1468 return self.decorate_class(f)
1469 @wraps(f)
1470 def _inner(*args, **kw):
1471 self._patch_dict()
1472 try:
1473 return f(*args, **kw)
1474 finally:
1475 self._unpatch_dict()
1476
1477 return _inner
1478
1479
1480 def decorate_class(self, klass):
1481 for attr in dir(klass):
1482 attr_value = getattr(klass, attr)
1483 if (attr.startswith(patch.TEST_PREFIX) and
1484 hasattr(attr_value, "__call__")):
1485 decorator = _patch_dict(self.in_dict, self.values, self.clear)
1486 decorated = decorator(attr_value)
1487 setattr(klass, attr, decorated)
1488 return klass
1489
1490
1491 def __enter__(self):
1492 """Patch the dict."""
1493 self._patch_dict()
1494
1495
1496 def _patch_dict(self):
1497 values = self.values
1498 in_dict = self.in_dict
1499 clear = self.clear
1500
1501 try:
1502 original = in_dict.copy()
1503 except AttributeError:
1504 # dict like object with no copy method
1505 # must support iteration over keys
1506 original = {}
1507 for key in in_dict:
1508 original[key] = in_dict[key]
1509 self._original = original
1510
1511 if clear:
1512 _clear_dict(in_dict)
1513
1514 try:
1515 in_dict.update(values)
1516 except AttributeError:
1517 # dict like object with no update method
1518 for key in values:
1519 in_dict[key] = values[key]
1520
1521
1522 def _unpatch_dict(self):
1523 in_dict = self.in_dict
1524 original = self._original
1525
1526 _clear_dict(in_dict)
1527
1528 try:
1529 in_dict.update(original)
1530 except AttributeError:
1531 for key in original:
1532 in_dict[key] = original[key]
1533
1534
1535 def __exit__(self, *args):
1536 """Unpatch the dict."""
1537 self._unpatch_dict()
1538 return False
1539
1540 start = __enter__
1541 stop = __exit__
1542
1543
1544def _clear_dict(in_dict):
1545 try:
1546 in_dict.clear()
1547 except AttributeError:
1548 keys = list(in_dict)
1549 for key in keys:
1550 del in_dict[key]
1551
1552
1553patch.object = _patch_object
1554patch.dict = _patch_dict
1555patch.multiple = _patch_multiple
1556patch.TEST_PREFIX = 'test'
1557
1558magic_methods = (
1559 "lt le gt ge eq ne "
1560 "getitem setitem delitem "
1561 "len contains iter "
1562 "hash str sizeof "
1563 "enter exit "
1564 "divmod neg pos abs invert "
1565 "complex int float index "
1566 "trunc floor ceil "
1567 "bool next "
1568)
1569
1570numerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
1571inplace = ' '.join('i%s' % n for n in numerics.split())
1572right = ' '.join('r%s' % n for n in numerics.split())
1573
1574# not including __prepare__, __instancecheck__, __subclasscheck__
1575# (as they are metaclass methods)
1576# __del__ is not supported at all as it causes problems if it exists
1577
1578_non_defaults = set('__%s__' % method for method in [
Michael Foord944e02d2012-03-25 23:12:55 +01001579 'get', 'set', 'delete', 'reversed', 'missing', 'reduce', 'reduce_ex',
1580 'getinitargs', 'getnewargs', 'getstate', 'setstate', 'getformat',
1581 'setformat', 'repr', 'dir', 'subclasses', 'format',
Michael Foord345266a2012-03-14 12:24:34 -07001582])
1583
1584
1585def _get_method(name, func):
1586 "Turns a callable object (like a mock) into a real function"
1587 def method(self, *args, **kw):
1588 return func(self, *args, **kw)
1589 method.__name__ = name
1590 return method
1591
1592
1593_magics = set(
1594 '__%s__' % method for method in
1595 ' '.join([magic_methods, numerics, inplace, right]).split()
1596)
1597
1598_all_magics = _magics | _non_defaults
1599
1600_unsupported_magics = set([
1601 '__getattr__', '__setattr__',
1602 '__init__', '__new__', '__prepare__'
1603 '__instancecheck__', '__subclasscheck__',
1604 '__del__'
1605])
1606
1607_calculate_return_value = {
1608 '__hash__': lambda self: object.__hash__(self),
1609 '__str__': lambda self: object.__str__(self),
1610 '__sizeof__': lambda self: object.__sizeof__(self),
1611}
1612
1613_return_values = {
Michael Foord313f85f2012-03-25 18:16:07 +01001614 '__lt__': NotImplemented,
1615 '__gt__': NotImplemented,
1616 '__le__': NotImplemented,
1617 '__ge__': NotImplemented,
Michael Foord345266a2012-03-14 12:24:34 -07001618 '__int__': 1,
1619 '__contains__': False,
1620 '__len__': 0,
1621 '__exit__': False,
1622 '__complex__': 1j,
1623 '__float__': 1.0,
1624 '__bool__': True,
1625 '__index__': 1,
1626}
1627
1628
1629def _get_eq(self):
1630 def __eq__(other):
1631 ret_val = self.__eq__._mock_return_value
1632 if ret_val is not DEFAULT:
1633 return ret_val
1634 return self is other
1635 return __eq__
1636
1637def _get_ne(self):
1638 def __ne__(other):
1639 if self.__ne__._mock_return_value is not DEFAULT:
1640 return DEFAULT
1641 return self is not other
1642 return __ne__
1643
1644def _get_iter(self):
1645 def __iter__():
1646 ret_val = self.__iter__._mock_return_value
1647 if ret_val is DEFAULT:
1648 return iter([])
1649 # if ret_val was already an iterator, then calling iter on it should
1650 # return the iterator unchanged
1651 return iter(ret_val)
1652 return __iter__
1653
1654_side_effect_methods = {
1655 '__eq__': _get_eq,
1656 '__ne__': _get_ne,
1657 '__iter__': _get_iter,
1658}
1659
1660
1661
1662def _set_return_value(mock, method, name):
1663 fixed = _return_values.get(name, DEFAULT)
1664 if fixed is not DEFAULT:
1665 method.return_value = fixed
1666 return
1667
1668 return_calulator = _calculate_return_value.get(name)
1669 if return_calulator is not None:
1670 try:
1671 return_value = return_calulator(mock)
1672 except AttributeError:
1673 # XXXX why do we return AttributeError here?
1674 # set it as a side_effect instead?
1675 return_value = AttributeError(name)
1676 method.return_value = return_value
1677 return
1678
1679 side_effector = _side_effect_methods.get(name)
1680 if side_effector is not None:
1681 method.side_effect = side_effector(mock)
1682
1683
1684
1685class MagicMixin(object):
1686 def __init__(self, *args, **kw):
1687 super(MagicMixin, self).__init__(*args, **kw)
1688 self._mock_set_magics()
1689
1690
1691 def _mock_set_magics(self):
1692 these_magics = _magics
1693
1694 if self._mock_methods is not None:
1695 these_magics = _magics.intersection(self._mock_methods)
1696
1697 remove_magics = set()
1698 remove_magics = _magics - these_magics
1699
1700 for entry in remove_magics:
1701 if entry in type(self).__dict__:
1702 # remove unneeded magic methods
1703 delattr(self, entry)
1704
1705 # don't overwrite existing attributes if called a second time
1706 these_magics = these_magics - set(type(self).__dict__)
1707
1708 _type = type(self)
1709 for entry in these_magics:
1710 setattr(_type, entry, MagicProxy(entry, self))
1711
1712
1713
1714class NonCallableMagicMock(MagicMixin, NonCallableMock):
1715 """A version of `MagicMock` that isn't callable."""
1716 def mock_add_spec(self, spec, spec_set=False):
1717 """Add a spec to a mock. `spec` can either be an object or a
1718 list of strings. Only attributes on the `spec` can be fetched as
1719 attributes from the mock.
1720
1721 If `spec_set` is True then only attributes on the spec can be set."""
1722 self._mock_add_spec(spec, spec_set)
1723 self._mock_set_magics()
1724
1725
1726
1727class MagicMock(MagicMixin, Mock):
1728 """
1729 MagicMock is a subclass of Mock with default implementations
1730 of most of the magic methods. You can use MagicMock without having to
1731 configure the magic methods yourself.
1732
1733 If you use the `spec` or `spec_set` arguments then *only* magic
1734 methods that exist in the spec will be created.
1735
1736 Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
1737 """
1738 def mock_add_spec(self, spec, spec_set=False):
1739 """Add a spec to a mock. `spec` can either be an object or a
1740 list of strings. Only attributes on the `spec` can be fetched as
1741 attributes from the mock.
1742
1743 If `spec_set` is True then only attributes on the spec can be set."""
1744 self._mock_add_spec(spec, spec_set)
1745 self._mock_set_magics()
1746
1747
1748
1749class MagicProxy(object):
1750 def __init__(self, name, parent):
1751 self.name = name
1752 self.parent = parent
1753
1754 def __call__(self, *args, **kwargs):
1755 m = self.create_mock()
1756 return m(*args, **kwargs)
1757
1758 def create_mock(self):
1759 entry = self.name
1760 parent = self.parent
1761 m = parent._get_child_mock(name=entry, _new_name=entry,
1762 _new_parent=parent)
1763 setattr(parent, entry, m)
1764 _set_return_value(parent, m, entry)
1765 return m
1766
1767 def __get__(self, obj, _type=None):
1768 return self.create_mock()
1769
1770
1771
1772class _ANY(object):
1773 "A helper object that compares equal to everything."
1774
1775 def __eq__(self, other):
1776 return True
1777
1778 def __ne__(self, other):
1779 return False
1780
1781 def __repr__(self):
1782 return '<ANY>'
1783
1784ANY = _ANY()
1785
1786
1787
1788def _format_call_signature(name, args, kwargs):
1789 message = '%s(%%s)' % name
1790 formatted_args = ''
1791 args_string = ', '.join([repr(arg) for arg in args])
1792 kwargs_string = ', '.join([
1793 '%s=%r' % (key, value) for key, value in kwargs.items()
1794 ])
1795 if args_string:
1796 formatted_args = args_string
1797 if kwargs_string:
1798 if formatted_args:
1799 formatted_args += ', '
1800 formatted_args += kwargs_string
1801
1802 return message % formatted_args
1803
1804
1805
1806class _Call(tuple):
1807 """
1808 A tuple for holding the results of a call to a mock, either in the form
1809 `(args, kwargs)` or `(name, args, kwargs)`.
1810
1811 If args or kwargs are empty then a call tuple will compare equal to
1812 a tuple without those values. This makes comparisons less verbose::
1813
1814 _Call(('name', (), {})) == ('name',)
1815 _Call(('name', (1,), {})) == ('name', (1,))
1816 _Call(((), {'a': 'b'})) == ({'a': 'b'},)
1817
1818 The `_Call` object provides a useful shortcut for comparing with call::
1819
1820 _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
1821 _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
1822
1823 If the _Call has no name then it will match any name.
1824 """
1825 def __new__(cls, value=(), name=None, parent=None, two=False,
1826 from_kall=True):
1827 name = ''
1828 args = ()
1829 kwargs = {}
1830 _len = len(value)
1831 if _len == 3:
1832 name, args, kwargs = value
1833 elif _len == 2:
1834 first, second = value
1835 if isinstance(first, str):
1836 name = first
1837 if isinstance(second, tuple):
1838 args = second
1839 else:
1840 kwargs = second
1841 else:
1842 args, kwargs = first, second
1843 elif _len == 1:
1844 value, = value
1845 if isinstance(value, str):
1846 name = value
1847 elif isinstance(value, tuple):
1848 args = value
1849 else:
1850 kwargs = value
1851
1852 if two:
1853 return tuple.__new__(cls, (args, kwargs))
1854
1855 return tuple.__new__(cls, (name, args, kwargs))
1856
1857
1858 def __init__(self, value=(), name=None, parent=None, two=False,
1859 from_kall=True):
1860 self.name = name
1861 self.parent = parent
1862 self.from_kall = from_kall
1863
1864
1865 def __eq__(self, other):
1866 if other is ANY:
1867 return True
1868 try:
1869 len_other = len(other)
1870 except TypeError:
1871 return False
1872
1873 self_name = ''
1874 if len(self) == 2:
1875 self_args, self_kwargs = self
1876 else:
1877 self_name, self_args, self_kwargs = self
1878
1879 other_name = ''
1880 if len_other == 0:
1881 other_args, other_kwargs = (), {}
1882 elif len_other == 3:
1883 other_name, other_args, other_kwargs = other
1884 elif len_other == 1:
1885 value, = other
1886 if isinstance(value, tuple):
1887 other_args = value
1888 other_kwargs = {}
1889 elif isinstance(value, str):
1890 other_name = value
1891 other_args, other_kwargs = (), {}
1892 else:
1893 other_args = ()
1894 other_kwargs = value
1895 else:
1896 # len 2
1897 # could be (name, args) or (name, kwargs) or (args, kwargs)
1898 first, second = other
1899 if isinstance(first, str):
1900 other_name = first
1901 if isinstance(second, tuple):
1902 other_args, other_kwargs = second, {}
1903 else:
1904 other_args, other_kwargs = (), second
1905 else:
1906 other_args, other_kwargs = first, second
1907
1908 if self_name and other_name != self_name:
1909 return False
1910
1911 # this order is important for ANY to work!
1912 return (other_args, other_kwargs) == (self_args, self_kwargs)
1913
1914
1915 def __ne__(self, other):
1916 return not self.__eq__(other)
1917
1918
1919 def __call__(self, *args, **kwargs):
1920 if self.name is None:
1921 return _Call(('', args, kwargs), name='()')
1922
1923 name = self.name + '()'
1924 return _Call((self.name, args, kwargs), name=name, parent=self)
1925
1926
1927 def __getattr__(self, attr):
1928 if self.name is None:
1929 return _Call(name=attr, from_kall=False)
1930 name = '%s.%s' % (self.name, attr)
1931 return _Call(name=name, parent=self, from_kall=False)
1932
1933
1934 def __repr__(self):
1935 if not self.from_kall:
1936 name = self.name or 'call'
1937 if name.startswith('()'):
1938 name = 'call%s' % name
1939 return name
1940
1941 if len(self) == 2:
1942 name = 'call'
1943 args, kwargs = self
1944 else:
1945 name, args, kwargs = self
1946 if not name:
1947 name = 'call'
1948 elif not name.startswith('()'):
1949 name = 'call.%s' % name
1950 else:
1951 name = 'call%s' % name
1952 return _format_call_signature(name, args, kwargs)
1953
1954
1955 def call_list(self):
1956 """For a call object that represents multiple calls, `call_list`
1957 returns a list of all the intermediate calls as well as the
1958 final call."""
1959 vals = []
1960 thing = self
1961 while thing is not None:
1962 if thing.from_kall:
1963 vals.append(thing)
1964 thing = thing.parent
1965 return _CallList(reversed(vals))
1966
1967
1968call = _Call(from_kall=False)
1969
1970
1971
1972def create_autospec(spec, spec_set=False, instance=False, _parent=None,
1973 _name=None, **kwargs):
1974 """Create a mock object using another object as a spec. Attributes on the
1975 mock will use the corresponding attribute on the `spec` object as their
1976 spec.
1977
1978 Functions or methods being mocked will have their arguments checked
1979 to check that they are called with the correct signature.
1980
1981 If `spec_set` is True then attempting to set attributes that don't exist
1982 on the spec object will raise an `AttributeError`.
1983
1984 If a class is used as a spec then the return value of the mock (the
1985 instance of the class) will have the same spec. You can use a class as the
1986 spec for an instance object by passing `instance=True`. The returned mock
1987 will only be callable if instances of the mock are callable.
1988
1989 `create_autospec` also takes arbitrary keyword arguments that are passed to
1990 the constructor of the created mock."""
1991 if _is_list(spec):
1992 # can't pass a list instance to the mock constructor as it will be
1993 # interpreted as a list of strings
1994 spec = type(spec)
1995
1996 is_type = isinstance(spec, type)
1997
1998 _kwargs = {'spec': spec}
1999 if spec_set:
2000 _kwargs = {'spec_set': spec}
2001 elif spec is None:
2002 # None we mock with a normal mock without a spec
2003 _kwargs = {}
2004
2005 _kwargs.update(kwargs)
2006
2007 Klass = MagicMock
2008 if type(spec) in DescriptorTypes:
2009 # descriptors don't have a spec
2010 # because we don't know what type they return
2011 _kwargs = {}
2012 elif not _callable(spec):
2013 Klass = NonCallableMagicMock
2014 elif is_type and instance and not _instance_callable(spec):
2015 Klass = NonCallableMagicMock
2016
2017 _new_name = _name
2018 if _parent is None:
2019 # for a top level object no _new_name should be set
2020 _new_name = ''
2021
2022 mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2023 name=_name, **_kwargs)
2024
2025 if isinstance(spec, FunctionTypes):
2026 # should only happen at the top level because we don't
2027 # recurse for functions
2028 mock = _set_signature(mock, spec)
2029 else:
2030 _check_signature(spec, mock, is_type, instance)
2031
2032 if _parent is not None and not instance:
2033 _parent._mock_children[_name] = mock
2034
2035 if is_type and not instance and 'return_value' not in kwargs:
Michael Foord345266a2012-03-14 12:24:34 -07002036 mock.return_value = create_autospec(spec, spec_set, instance=True,
2037 _name='()', _parent=mock)
2038
2039 for entry in dir(spec):
2040 if _is_magic(entry):
2041 # MagicMock already does the useful magic methods for us
2042 continue
2043
Michael Foord345266a2012-03-14 12:24:34 -07002044 # XXXX do we need a better way of getting attributes without
2045 # triggering code execution (?) Probably not - we need the actual
2046 # object to mock it so we would rather trigger a property than mock
2047 # the property descriptor. Likewise we want to mock out dynamically
2048 # provided attributes.
2049 # XXXX what about attributes that raise exceptions on being fetched
2050 # we could be resilient against it, or catch and propagate the
2051 # exception when the attribute is fetched from the mock
2052 original = getattr(spec, entry)
2053
2054 kwargs = {'spec': original}
2055 if spec_set:
2056 kwargs = {'spec_set': original}
2057
2058 if not isinstance(original, FunctionTypes):
2059 new = _SpecState(original, spec_set, mock, entry, instance)
2060 mock._mock_children[entry] = new
2061 else:
2062 parent = mock
2063 if isinstance(spec, FunctionTypes):
2064 parent = mock.mock
2065
2066 new = MagicMock(parent=parent, name=entry, _new_name=entry,
2067 _new_parent=parent, **kwargs)
2068 mock._mock_children[entry] = new
2069 skipfirst = _must_skip(spec, entry, is_type)
2070 _check_signature(original, new, skipfirst=skipfirst)
2071
2072 # so functions created with _set_signature become instance attributes,
2073 # *plus* their underlying mock exists in _mock_children of the parent
2074 # mock. Adding to _mock_children may be unnecessary where we are also
2075 # setting as an instance attribute?
2076 if isinstance(new, FunctionTypes):
2077 setattr(mock, entry, new)
2078
2079 return mock
2080
2081
2082def _must_skip(spec, entry, is_type):
2083 if not isinstance(spec, type):
2084 if entry in getattr(spec, '__dict__', {}):
2085 # instance attribute - shouldn't skip
2086 return False
Michael Foord345266a2012-03-14 12:24:34 -07002087 spec = spec.__class__
Michael Foord345266a2012-03-14 12:24:34 -07002088
2089 for klass in spec.__mro__:
2090 result = klass.__dict__.get(entry, DEFAULT)
2091 if result is DEFAULT:
2092 continue
2093 if isinstance(result, (staticmethod, classmethod)):
2094 return False
2095 return is_type
2096
2097 # shouldn't get here unless function is a dynamically provided attribute
2098 # XXXX untested behaviour
2099 return is_type
2100
2101
2102def _get_class(obj):
2103 try:
2104 return obj.__class__
2105 except AttributeError:
Michael Foord50a8c0e2012-03-25 18:57:58 +01002106 # it is possible for objects to have no __class__
Michael Foord345266a2012-03-14 12:24:34 -07002107 return type(obj)
2108
2109
2110class _SpecState(object):
2111
2112 def __init__(self, spec, spec_set=False, parent=None,
2113 name=None, ids=None, instance=False):
2114 self.spec = spec
2115 self.ids = ids
2116 self.spec_set = spec_set
2117 self.parent = parent
2118 self.instance = instance
2119 self.name = name
2120
2121
2122FunctionTypes = (
2123 # python function
2124 type(create_autospec),
2125 # instance method
2126 type(ANY.__eq__),
Michael Foord345266a2012-03-14 12:24:34 -07002127)
2128
Michael Foord345266a2012-03-14 12:24:34 -07002129
Michael Foorda74561a2012-03-25 19:03:13 +01002130file_spec = None
Michael Foord345266a2012-03-14 12:24:34 -07002131
Michael Foord0dccf652012-03-25 19:11:50 +01002132
2133def mock_open(mock=None, read_data=''):
Michael Foord99254732012-03-25 19:07:33 +01002134 """
2135 A helper function to create a mock to replace the use of `open`. It works
2136 for `open` called directly or used as a context manager.
2137
2138 The `mock` argument is the mock object to configure. If `None` (the
2139 default) then a `MagicMock` will be created for you, with the API limited
2140 to methods or attributes available on standard file handles.
2141
2142 `read_data` is a string for the `read` method of the file handle to return.
2143 This is an empty string by default.
2144 """
Michael Foorda74561a2012-03-25 19:03:13 +01002145 global file_spec
2146 if file_spec is None:
2147 import _io
2148 file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2149
Michael Foord345266a2012-03-14 12:24:34 -07002150 if mock is None:
Michael Foord0dccf652012-03-25 19:11:50 +01002151 mock = MagicMock(name='open', spec=open)
Michael Foord345266a2012-03-14 12:24:34 -07002152
2153 handle = MagicMock(spec=file_spec)
2154 handle.write.return_value = None
2155 handle.__enter__.return_value = handle
Michael Foord0dccf652012-03-25 19:11:50 +01002156 handle.read.return_value = read_data
Michael Foord345266a2012-03-14 12:24:34 -07002157
2158 mock.return_value = handle
2159 return mock
2160
2161
2162class PropertyMock(Mock):
Michael Foord99254732012-03-25 19:07:33 +01002163 """
2164 A mock intended to be used as a property, or other descriptor, on a class.
2165 `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2166 a return value when it is fetched.
2167
2168 Fetching a `PropertyMock` instance from an object calls the mock, with
2169 no args. Setting it calls the mock with the value being set.
2170 """
Michael Foord345266a2012-03-14 12:24:34 -07002171 def __get__(self, obj, obj_type):
2172 return self()
2173 def __set__(self, obj, val):
2174 self(val)