Best Python code snippet using autotest_python
_mock_backport.py
Source:_mock_backport.py  
...576            del self._mock_children[name]577        self._mock_children[name] = _deleted578    def _format_mock_call_signature(self, args, kwargs):579        name = self._mock_name or 'mock'580        return _format_call_signature(name, args, kwargs)581    def _format_mock_failure_message(self, args, kwargs):582        message = 'Expected call: %s\nActual call: %s'583        expected_string = self._format_mock_call_signature(args, kwargs)584        call_args = self.call_args585        if len(call_args) == 3:586            call_args = call_args[1:]587        actual_string = self._format_mock_call_signature(*call_args)588        return message % (expected_string, actual_string)589    def _call_matcher(self, _call):590        """591        Given a call (or simply an (args, kwargs) tuple), return a592        comparison key suitable for matching with other calls.593        This is a best effort method which relies on the spec's signature,594        if available, or falls back on the arguments themselves.595        """596        sig = self._spec_signature597        if sig is not None:598            if len(_call) == 2:599                name = ''600                args, kwargs = _call601            else:602                name, args, kwargs = _call603            try:604                return name, sig.bind(*args, **kwargs)605            except TypeError as e:606                return e.with_traceback(None)607        else:608            return _call609    def assert_not_called(_mock_self):610        """assert that the mock was never called.611        """612        self = _mock_self613        if self.call_count != 0:614            msg = ("Expected '%s' to not have been called. Called %s times." %615                   (self._mock_name or 'mock', self.call_count))616            raise AssertionError(msg)617    def assert_called_with(_mock_self, *args, **kwargs):618        """assert that the mock was called with the specified arguments.619        Raises an AssertionError if the args and keyword args passed in are620        different to the last call to the mock."""621        self = _mock_self622        if self.call_args is None:623            expected = self._format_mock_call_signature(args, kwargs)624            raise AssertionError('Expected call: %s\nNot called' % (expected,))625        def _error_message():626            msg = self._format_mock_failure_message(args, kwargs)627            return msg628        expected = self._call_matcher((args, kwargs))629        actual = self._call_matcher(self.call_args)630        if expected != actual:631            raise AssertionError(_error_message())632    def assert_called_once_with(_mock_self, *args, **kwargs):633        """assert that the mock was called exactly once and with the specified634        arguments."""635        self = _mock_self636        if not self.call_count == 1:637            msg = ("Expected '%s' to be called once. Called %s times." %638                   (self._mock_name or 'mock', self.call_count))639            raise AssertionError(msg)640        return self.assert_called_with(*args, **kwargs)641    def assert_has_calls(self, calls, any_order=False):642        """assert the mock has been called with the specified calls.643        The `mock_calls` list is checked for the calls.644        If `any_order` is False (the default) then the calls must be645        sequential. There can be extra calls before or after the646        specified calls.647        If `any_order` is True then the calls can be in any order, but648        they must all appear in `mock_calls`."""649        expected = [self._call_matcher(c) for c in calls]650        all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)651        if not any_order:652            if expected not in all_calls:653                raise AssertionError(654                    'Calls not found.\nExpected: %r\n'655                    'Actual: %r' % (calls, self.mock_calls)656                )657            return658        all_calls = list(all_calls)659        not_found = []660        for kall in expected:661            try:662                all_calls.remove(kall)663            except ValueError:664                not_found.append(kall)665        if not_found:666            raise AssertionError(667                '%r not all found in call list' % (tuple(not_found),)668            )669    def assert_any_call(self, *args, **kwargs):670        """assert the mock has been called with the specified arguments.671        The assert passes if the mock has *ever* been called, unlike672        `assert_called_with` and `assert_called_once_with` that only pass if673        the call is the most recent one."""674        expected = self._call_matcher((args, kwargs))675        actual = [self._call_matcher(c) for c in self.call_args_list]676        if expected not in actual:677            expected_string = self._format_mock_call_signature(args, kwargs)678            raise AssertionError(679                '%s call not found' % expected_string680            )681    def _get_child_mock(self, **kw):682        """Create the child mocks for attributes and return value.683        By default child mocks will be the same type as the parent.684        Subclasses of Mock may want to override this to customize the way685        child mocks are made.686        For non-callable mocks the callable variant will be used (rather than687        any custom subclass)."""688        _type = type(self)689        if not issubclass(_type, CallableMixin):690            if issubclass(_type, NonCallableMagicMock):691                klass = MagicMock692            elif issubclass(_type, NonCallableMock) :693                klass = Mock694        else:695            klass = _type.__mro__[1]696        return klass(**kw)697def _try_iter(obj):698    if obj is None:699        return obj700    if _is_exception(obj):701        return obj702    if _callable(obj):703        return obj704    try:705        return iter(obj)706    except TypeError:707        # XXXX backwards compatibility708        # but this will blow up on first call - so maybe we should fail early?709        return obj710class CallableMixin(Base):711    def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,712                 wraps=None, name=None, spec_set=None, parent=None,713                 _spec_state=None, _new_name='', _new_parent=None, **kwargs):714        self.__dict__['_mock_return_value'] = return_value715        _safe_super(CallableMixin, self).__init__(716            spec, wraps, name, spec_set, parent,717            _spec_state, _new_name, _new_parent, **kwargs718        )719        self.side_effect = side_effect720    def _mock_check_sig(self, *args, **kwargs):721        # stub method that can be replaced with one with a specific signature722        pass723    def __call__(_mock_self, *args, **kwargs):724        # can't use self in-case a function / method we are mocking uses self725        # in the signature726        _mock_self._mock_check_sig(*args, **kwargs)727        return _mock_self._mock_call(*args, **kwargs)728    def _mock_call(_mock_self, *args, **kwargs):729        self = _mock_self730        self.called = True731        self.call_count += 1732        _new_name = self._mock_new_name733        _new_parent = self._mock_new_parent734        _call = _Call((args, kwargs), two=True)735        self.call_args = _call736        self.call_args_list.append(_call)737        self.mock_calls.append(_Call(('', args, kwargs)))738        seen = set()739        skip_next_dot = _new_name == '()'740        do_method_calls = self._mock_parent is not None741        name = self._mock_name742        while _new_parent is not None:743            this_mock_call = _Call((_new_name, args, kwargs))744            if _new_parent._mock_new_name:745                dot = '.'746                if skip_next_dot:747                    dot = ''748                skip_next_dot = False749                if _new_parent._mock_new_name == '()':750                    skip_next_dot = True751                _new_name = _new_parent._mock_new_name + dot + _new_name752            if do_method_calls:753                if _new_name == name:754                    this_method_call = this_mock_call755                else:756                    this_method_call = _Call((name, args, kwargs))757                _new_parent.method_calls.append(this_method_call)758                do_method_calls = _new_parent._mock_parent is not None759                if do_method_calls:760                    name = _new_parent._mock_name + '.' + name761            _new_parent.mock_calls.append(this_mock_call)762            _new_parent = _new_parent._mock_new_parent763            # use ids here so as not to call __hash__ on the mocks764            _new_parent_id = id(_new_parent)765            if _new_parent_id in seen:766                break767            seen.add(_new_parent_id)768        ret_val = DEFAULT769        effect = self.side_effect770        if effect is not None:771            if _is_exception(effect):772                raise effect773            if not _callable(effect):774                result = next(effect)775                if _is_exception(result):776                    raise result777                if result is DEFAULT:778                    result = self.return_value779                return result780            ret_val = effect(*args, **kwargs)781        if (self._mock_wraps is not None and782             self._mock_return_value is DEFAULT):783            return self._mock_wraps(*args, **kwargs)784        if ret_val is DEFAULT:785            ret_val = self.return_value786        return ret_val787class Mock(CallableMixin, NonCallableMock):788    """789    Create a new `Mock` object. `Mock` takes several optional arguments790    that specify the behaviour of the Mock object:791    * `spec`: This can be either a list of strings or an existing object (a792      class or instance) that acts as the specification for the mock object. If793      you pass in an object then a list of strings is formed by calling dir on794      the object (excluding unsupported magic attributes and methods). Accessing795      any attribute not in this list will raise an `AttributeError`.796      If `spec` is an object (rather than a list of strings) then797      `mock.__class__` returns the class of the spec object. This allows mocks798      to pass `isinstance` tests.799    * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*800      or get an attribute on the mock that isn't on the object passed as801      `spec_set` will raise an `AttributeError`.802    * `side_effect`: A function to be called whenever the Mock is called. See803      the `side_effect` attribute. Useful for raising exceptions or804      dynamically changing return values. The function is called with the same805      arguments as the mock, and unless it returns `DEFAULT`, the return806      value of this function is used as the return value.807      If `side_effect` is an iterable then each call to the mock will return808      the next value from the iterable. If any of the members of the iterable809      are exceptions they will be raised instead of returned.810    * `return_value`: The value returned when the mock is called. By default811      this is a new Mock (created on first access). See the812      `return_value` attribute.813    * `wraps`: Item for the mock object to wrap. If `wraps` is not None then814      calling the Mock will pass the call through to the wrapped object815      (returning the real result). Attribute access on the mock will return a816      Mock object that wraps the corresponding attribute of the wrapped object817      (so attempting to access an attribute that doesn't exist will raise an818      `AttributeError`).819      If the mock has an explicit `return_value` set then calls are not passed820      to the wrapped object and the `return_value` is returned instead.821    * `name`: If the mock has a name then it will be used in the repr of the822      mock. This can be useful for debugging. The name is propagated to child823      mocks.824    Mocks can also be called with arbitrary keyword arguments. These will be825    used to set attributes on the mock after it is created.826    """827def _dot_lookup(thing, comp, import_path):828    try:829        return getattr(thing, comp)830    except AttributeError:831        __import__(import_path)832        return getattr(thing, comp)833def _importer(target):834    components = target.split('.')835    import_path = components.pop(0)836    thing = __import__(import_path)837    for comp in components:838        import_path += ".%s" % comp839        thing = _dot_lookup(thing, comp, import_path)840    return thing841def _is_started(patcher):842    # XXXX horrible843    return hasattr(patcher, 'is_local')844class _patch(object):845    attribute_name = None846    _active_patches = []847    def __init__(848            self, getter, attribute, new, spec, create,849            spec_set, autospec, new_callable, kwargs850        ):851        if new_callable is not None:852            if new is not DEFAULT:853                raise ValueError(854                    "Cannot use 'new' and 'new_callable' together"855                )856            if autospec is not None:857                raise ValueError(858                    "Cannot use 'autospec' and 'new_callable' together"859                )860        self.getter = getter861        self.attribute = attribute862        self.new = new863        self.new_callable = new_callable864        self.spec = spec865        self.create = create866        self.has_local = False867        self.spec_set = spec_set868        self.autospec = autospec869        self.kwargs = kwargs870        self.additional_patchers = []871    def copy(self):872        patcher = _patch(873            self.getter, self.attribute, self.new, self.spec,874            self.create, self.spec_set,875            self.autospec, self.new_callable, self.kwargs876        )877        patcher.attribute_name = self.attribute_name878        patcher.additional_patchers = [879            p.copy() for p in self.additional_patchers880        ]881        return patcher882    def __call__(self, func):883        if isinstance(func, type):884            return self.decorate_class(func)885        return self.decorate_callable(func)886    def decorate_class(self, klass):887        for attr in dir(klass):888            if not attr.startswith(patch.TEST_PREFIX):889                continue890            attr_value = getattr(klass, attr)891            if not hasattr(attr_value, "__call__"):892                continue893            patcher = self.copy()894            setattr(klass, attr, patcher(attr_value))895        return klass896    def decorate_callable(self, func):897        if hasattr(func, 'patchings'):898            func.patchings.append(self)899            return func900        @wraps(func)901        def patched(*args, **keywargs):902            extra_args = []903            entered_patchers = []904            exc_info = tuple()905            try:906                for patching in patched.patchings:907                    arg = patching.__enter__()908                    entered_patchers.append(patching)909                    if patching.attribute_name is not None:910                        keywargs.update(arg)911                    elif patching.new is DEFAULT:912                        extra_args.append(arg)913                args += tuple(extra_args)914                return func(*args, **keywargs)915            except:916                if (patching not in entered_patchers and917                    _is_started(patching)):918                    # the patcher may have been started, but an exception919                    # raised whilst entering one of its additional_patchers920                    entered_patchers.append(patching)921                # Pass the exception to __exit__922                exc_info = sys.exc_info()923                # re-raise the exception924                raise925            finally:926                for patching in reversed(entered_patchers):927                    patching.__exit__(*exc_info)928        patched.patchings = [self]929        return patched930    def get_original(self):931        target = self.getter()932        name = self.attribute933        original = DEFAULT934        local = False935        try:936            original = target.__dict__[name]937        except (AttributeError, KeyError):938            original = getattr(target, name, DEFAULT)939        else:940            local = True941        if name in _builtins and isinstance(target, ModuleType):942            self.create = True943        if not self.create and original is DEFAULT:944            raise AttributeError(945                "%s does not have the attribute %r" % (target, name)946            )947        return original, local948    def __enter__(self):949        """Perform the patch."""950        new, spec, spec_set = self.new, self.spec, self.spec_set951        autospec, kwargs = self.autospec, self.kwargs952        new_callable = self.new_callable953        self.target = self.getter()954        # normalise False to None955        if spec is False:956            spec = None957        if spec_set is False:958            spec_set = None959        if autospec is False:960            autospec = None961        if spec is not None and autospec is not None:962            raise TypeError("Can't specify spec and autospec")963        if ((spec is not None or autospec is not None) and964            spec_set not in (True, None)):965            raise TypeError("Can't provide explicit spec_set *and* spec or autospec")966        original, local = self.get_original()967        if new is DEFAULT and autospec is None:968            inherit = False969            if spec is True:970                # set spec to the object we are replacing971                spec = original972                if spec_set is True:973                    spec_set = original974                    spec = None975            elif spec is not None:976                if spec_set is True:977                    spec_set = spec978                    spec = None979            elif spec_set is True:980                spec_set = original981            if spec is not None or spec_set is not None:982                if original is DEFAULT:983                    raise TypeError("Can't use 'spec' with create=True")984                if isinstance(original, type):985                    # If we're patching out a class and there is a spec986                    inherit = True987            Klass = MagicMock988            _kwargs = {}989            if new_callable is not None:990                Klass = new_callable991            elif spec is not None or spec_set is not None:992                this_spec = spec993                if spec_set is not None:994                    this_spec = spec_set995                if _is_list(this_spec):996                    not_callable = '__call__' not in this_spec997                else:998                    not_callable = not callable(this_spec)999                if not_callable:1000                    Klass = NonCallableMagicMock1001            if spec is not None:1002                _kwargs['spec'] = spec1003            if spec_set is not None:1004                _kwargs['spec_set'] = spec_set1005            # add a name to mocks1006            if (isinstance(Klass, type) and1007                issubclass(Klass, NonCallableMock) and self.attribute):1008                _kwargs['name'] = self.attribute1009            _kwargs.update(kwargs)1010            new = Klass(**_kwargs)1011            if inherit and _is_instance_mock(new):1012                # we can only tell if the instance should be callable if the1013                # spec is not a list1014                this_spec = spec1015                if spec_set is not None:1016                    this_spec = spec_set1017                if (not _is_list(this_spec) and not1018                    _instance_callable(this_spec)):1019                    Klass = NonCallableMagicMock1020                _kwargs.pop('name')1021                new.return_value = Klass(_new_parent=new, _new_name='()',1022                                         **_kwargs)1023        elif autospec is not None:1024            # spec is ignored, new *must* be default, spec_set is treated1025            # as a boolean. Should we check spec is not None and that spec_set1026            # is a bool?1027            if new is not DEFAULT:1028                raise TypeError(1029                    "autospec creates the mock for you. Can't specify "1030                    "autospec and new."1031                )1032            if original is DEFAULT:1033                raise TypeError("Can't use 'autospec' with create=True")1034            spec_set = bool(spec_set)1035            if autospec is True:1036                autospec = original1037            new = create_autospec(autospec, spec_set=spec_set,1038                                  _name=self.attribute, **kwargs)1039        elif kwargs:1040            # can't set keyword args when we aren't creating the mock1041            # XXXX If new is a Mock we could call new.configure_mock(**kwargs)1042            raise TypeError("Can't pass kwargs to a mock we aren't creating")1043        new_attr = new1044        self.temp_original = original1045        self.is_local = local1046        setattr(self.target, self.attribute, new_attr)1047        if self.attribute_name is not None:1048            extra_args = {}1049            if self.new is DEFAULT:1050                extra_args[self.attribute_name] =  new1051            for patching in self.additional_patchers:1052                arg = patching.__enter__()1053                if patching.new is DEFAULT:1054                    extra_args.update(arg)1055            return extra_args1056        return new1057    def __exit__(self, *exc_info):1058        """Undo the patch."""1059        if not _is_started(self):1060            raise RuntimeError('stop called on unstarted patcher')1061        if self.is_local and self.temp_original is not DEFAULT:1062            setattr(self.target, self.attribute, self.temp_original)1063        else:1064            delattr(self.target, self.attribute)1065            if not self.create and not hasattr(self.target, self.attribute):1066                # needed for proxy objects like django settings1067                setattr(self.target, self.attribute, self.temp_original)1068        del self.temp_original1069        del self.is_local1070        del self.target1071        for patcher in reversed(self.additional_patchers):1072            if _is_started(patcher):1073                patcher.__exit__(*exc_info)1074    def start(self):1075        """Activate a patch, returning any created mock."""1076        result = self.__enter__()1077        self._active_patches.append(self)1078        return result1079    def stop(self):1080        """Stop an active patch."""1081        try:1082            self._active_patches.remove(self)1083        except ValueError:1084            # If the patch hasn't been started this will fail1085            pass1086        return self.__exit__()1087def _get_target(target):1088    try:1089        target, attribute = target.rsplit('.', 1)1090    except (TypeError, ValueError):1091        raise TypeError("Need a valid target to patch. You supplied: %r" %1092                        (target,))1093    getter = lambda: _importer(target)1094    return getter, attribute1095def _patch_object(1096        target, attribute, new=DEFAULT, spec=None,1097        create=False, spec_set=None, autospec=None,1098        new_callable=None, **kwargs1099    ):1100    """1101    patch the named member (`attribute`) on an object (`target`) with a mock1102    object.1103    `patch.object` can be used as a decorator, class decorator or a context1104    manager. Arguments `new`, `spec`, `create`, `spec_set`,1105    `autospec` and `new_callable` have the same meaning as for `patch`. Like1106    `patch`, `patch.object` takes arbitrary keyword arguments for configuring1107    the mock object it creates.1108    When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`1109    for choosing which methods to wrap.1110    """1111    getter = lambda: target1112    return _patch(1113        getter, attribute, new, spec, create,1114        spec_set, autospec, new_callable, kwargs1115    )1116def _patch_multiple(target, spec=None, create=False, spec_set=None,1117                    autospec=None, new_callable=None, **kwargs):1118    """Perform multiple patches in a single call. It takes the object to be1119    patched (either as an object or a string to fetch the object by importing)1120    and keyword arguments for the patches::1121        with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):1122            ...1123    Use `DEFAULT` as the value if you want `patch.multiple` to create1124    mocks for you. In this case the created mocks are passed into a decorated1125    function by keyword, and a dictionary is returned when `patch.multiple` is1126    used as a context manager.1127    `patch.multiple` can be used as a decorator, class decorator or a context1128    manager. The arguments `spec`, `spec_set`, `create`,1129    `autospec` and `new_callable` have the same meaning as for `patch`. These1130    arguments will be applied to *all* patches done by `patch.multiple`.1131    When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`1132    for choosing which methods to wrap.1133    """1134    if type(target) is str:1135        getter = lambda: _importer(target)1136    else:1137        getter = lambda: target1138    if not kwargs:1139        raise ValueError(1140            'Must supply at least one keyword argument with patch.multiple'1141        )1142    # need to wrap in a list for python 3, where items is a view1143    items = list(kwargs.items())1144    attribute, new = items[0]1145    patcher = _patch(1146        getter, attribute, new, spec, create, spec_set,1147        autospec, new_callable, {}1148    )1149    patcher.attribute_name = attribute1150    for attribute, new in items[1:]:1151        this_patcher = _patch(1152            getter, attribute, new, spec, create, spec_set,1153            autospec, new_callable, {}1154        )1155        this_patcher.attribute_name = attribute1156        patcher.additional_patchers.append(this_patcher)1157    return patcher1158def patch(1159        target, new=DEFAULT, spec=None, create=False,1160        spec_set=None, autospec=None, new_callable=None, **kwargs1161    ):1162    """1163    `patch` acts as a function decorator, class decorator or a context1164    manager. Inside the body of the function or with statement, the `target`1165    is patched with a `new` object. When the function/with statement exits1166    the patch is undone.1167    If `new` is omitted, then the target is replaced with a1168    `MagicMock`. If `patch` is used as a decorator and `new` is1169    omitted, the created mock is passed in as an extra argument to the1170    decorated function. If `patch` is used as a context manager the created1171    mock is returned by the context manager.1172    `target` should be a string in the form `'package.module.ClassName'`. The1173    `target` is imported and the specified object replaced with the `new`1174    object, so the `target` must be importable from the environment you are1175    calling `patch` from. The target is imported when the decorated function1176    is executed, not at decoration time.1177    The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`1178    if patch is creating one for you.1179    In addition you can pass `spec=True` or `spec_set=True`, which causes1180    patch to pass in the object being mocked as the spec/spec_set object.1181    `new_callable` allows you to specify a different class, or callable object,1182    that will be called to create the `new` object. By default `MagicMock` is1183    used.1184    A more powerful form of `spec` is `autospec`. If you set `autospec=True`1185    then the mock with be created with a spec from the object being replaced.1186    All attributes of the mock will also have the spec of the corresponding1187    attribute of the object being replaced. Methods and functions being1188    mocked will have their arguments checked and will raise a `TypeError` if1189    they are called with the wrong signature. For mocks replacing a class,1190    their return value (the 'instance') will have the same spec as the class.1191    Instead of `autospec=True` you can pass `autospec=some_object` to use an1192    arbitrary object as the spec instead of the one being replaced.1193    By default `patch` will fail to replace attributes that don't exist. If1194    you pass in `create=True`, and the attribute doesn't exist, patch will1195    create the attribute for you when the patched function is called, and1196    delete it again afterwards. This is useful for writing tests against1197    attributes that your production code creates at runtime. It is off by1198    default because it can be dangerous. With it switched on you can write1199    passing tests against APIs that don't actually exist!1200    Patch can be used as a `TestCase` class decorator. It works by1201    decorating each test method in the class. This reduces the boilerplate1202    code when your test methods share a common patchings set. `patch` finds1203    tests by looking for method names that start with `patch.TEST_PREFIX`.1204    By default this is `test`, which matches the way `unittest` finds tests.1205    You can specify an alternative prefix by setting `patch.TEST_PREFIX`.1206    Patch can be used as a context manager, with the with statement. Here the1207    patching applies to the indented block after the with statement. If you1208    use "as" then the patched object will be bound to the name after the1209    "as"; very useful if `patch` is creating a mock object for you.1210    `patch` takes arbitrary keyword arguments. These will be passed to1211    the `Mock` (or `new_callable`) on construction.1212    `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are1213    available for alternate use-cases.1214    """1215    getter, attribute = _get_target(target)1216    return _patch(1217        getter, attribute, new, spec, create,1218        spec_set, autospec, new_callable, kwargs1219    )1220class _patch_dict(object):1221    """1222    Patch a dictionary, or dictionary like object, and restore the dictionary1223    to its original state after the test.1224    `in_dict` can be a dictionary or a mapping like container. If it is a1225    mapping then it must at least support getting, setting and deleting items1226    plus iterating over keys.1227    `in_dict` can also be a string specifying the name of the dictionary, which1228    will then be fetched by importing it.1229    `values` can be a dictionary of values to set in the dictionary. `values`1230    can also be an iterable of `(key, value)` pairs.1231    If `clear` is True then the dictionary will be cleared before the new1232    values are set.1233    `patch.dict` can also be called with arbitrary keyword arguments to set1234    values in the dictionary::1235        with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):1236            ...1237    `patch.dict` can be used as a context manager, decorator or class1238    decorator. When used as a class decorator `patch.dict` honours1239    `patch.TEST_PREFIX` for choosing which methods to wrap.1240    """1241    def __init__(self, in_dict, values=(), clear=False, **kwargs):1242        if isinstance(in_dict, str):1243            in_dict = _importer(in_dict)1244        self.in_dict = in_dict1245        # support any argument supported by dict(...) constructor1246        self.values = dict(values)1247        self.values.update(kwargs)1248        self.clear = clear1249        self._original = None1250    def __call__(self, f):1251        if isinstance(f, type):1252            return self.decorate_class(f)1253        @wraps(f)1254        def _inner(*args, **kw):1255            self._patch_dict()1256            try:1257                return f(*args, **kw)1258            finally:1259                self._unpatch_dict()1260        return _inner1261    def decorate_class(self, klass):1262        for attr in dir(klass):1263            attr_value = getattr(klass, attr)1264            if (attr.startswith(patch.TEST_PREFIX) and1265                 hasattr(attr_value, "__call__")):1266                decorator = _patch_dict(self.in_dict, self.values, self.clear)1267                decorated = decorator(attr_value)1268                setattr(klass, attr, decorated)1269        return klass1270    def __enter__(self):1271        """Patch the dict."""1272        self._patch_dict()1273    def _patch_dict(self):1274        values = self.values1275        in_dict = self.in_dict1276        clear = self.clear1277        try:1278            original = in_dict.copy()1279        except AttributeError:1280            # dict like object with no copy method1281            # must support iteration over keys1282            original = {}1283            for key in in_dict:1284                original[key] = in_dict[key]1285        self._original = original1286        if clear:1287            _clear_dict(in_dict)1288        try:1289            in_dict.update(values)1290        except AttributeError:1291            # dict like object with no update method1292            for key in values:1293                in_dict[key] = values[key]1294    def _unpatch_dict(self):1295        in_dict = self.in_dict1296        original = self._original1297        _clear_dict(in_dict)1298        try:1299            in_dict.update(original)1300        except AttributeError:1301            for key in original:1302                in_dict[key] = original[key]1303    def __exit__(self, *args):1304        """Unpatch the dict."""1305        self._unpatch_dict()1306        return False1307    start = __enter__1308    stop = __exit__1309def _clear_dict(in_dict):1310    try:1311        in_dict.clear()1312    except AttributeError:1313        keys = list(in_dict)1314        for key in keys:1315            del in_dict[key]1316def _patch_stopall():1317    """Stop all active patches. LIFO to unroll nested patches."""1318    for patch in reversed(_patch._active_patches):1319        patch.stop()1320patch.object = _patch_object1321patch.dict = _patch_dict1322patch.multiple = _patch_multiple1323patch.stopall = _patch_stopall1324patch.TEST_PREFIX = 'test'1325magic_methods = (1326    "lt le gt ge eq ne "1327    "getitem setitem delitem "1328    "len contains iter "1329    "hash str sizeof "1330    "enter exit "1331    "divmod neg pos abs invert "1332    "complex int float index "1333    "trunc floor ceil "1334    "bool next "1335)1336numerics = (1337    "add sub mul div floordiv mod lshift rshift and xor or pow truediv"1338)1339inplace = ' '.join('i%s' % n for n in numerics.split())1340right = ' '.join('r%s' % n for n in numerics.split())1341# not including __prepare__, __instancecheck__, __subclasscheck__1342# (as they are metaclass methods)1343# __del__ is not supported at all as it causes problems if it exists1344_non_defaults = set('__%s__' % method for method in [1345    'get', 'set', 'delete', 'reversed', 'missing', 'reduce', 'reduce_ex',1346    'getinitargs', 'getnewargs', 'getstate', 'setstate', 'getformat',1347    'setformat', 'repr', 'dir', 'subclasses', 'format',1348])1349def _get_method(name, func):1350    "Turns a callable object (like a mock) into a real function"1351    def method(self, *args, **kw):1352        return func(self, *args, **kw)1353    method.__name__ = name1354    return method1355_magics = set(1356    '__%s__' % method for method in1357    ' '.join([magic_methods, numerics, inplace, right]).split()1358)1359_all_magics = _magics | _non_defaults1360_unsupported_magics = set([1361    '__getattr__', '__setattr__',1362    '__init__', '__new__', '__prepare__'1363    '__instancecheck__', '__subclasscheck__',1364    '__del__'1365])1366_calculate_return_value = {1367    '__hash__': lambda self: object.__hash__(self),1368    '__str__': lambda self: object.__str__(self),1369    '__sizeof__': lambda self: object.__sizeof__(self),1370}1371_return_values = {1372    '__lt__': NotImplemented,1373    '__gt__': NotImplemented,1374    '__le__': NotImplemented,1375    '__ge__': NotImplemented,1376    '__int__': 1,1377    '__contains__': False,1378    '__len__': 0,1379    '__exit__': False,1380    '__complex__': 1j,1381    '__float__': 1.0,1382    '__bool__': True,1383    '__index__': 1,1384}1385def _get_eq(self):1386    def __eq__(other):1387        ret_val = self.__eq__._mock_return_value1388        if ret_val is not DEFAULT:1389            return ret_val1390        return self is other1391    return __eq__1392def _get_ne(self):1393    def __ne__(other):1394        if self.__ne__._mock_return_value is not DEFAULT:1395            return DEFAULT1396        return self is not other1397    return __ne__1398def _get_iter(self):1399    def __iter__():1400        ret_val = self.__iter__._mock_return_value1401        if ret_val is DEFAULT:1402            return iter([])1403        # if ret_val was already an iterator, then calling iter on it should1404        # return the iterator unchanged1405        return iter(ret_val)1406    return __iter__1407_side_effect_methods = {1408    '__eq__': _get_eq,1409    '__ne__': _get_ne,1410    '__iter__': _get_iter,1411}1412def _set_return_value(mock, method, name):1413    fixed = _return_values.get(name, DEFAULT)1414    if fixed is not DEFAULT:1415        method.return_value = fixed1416        return1417    return_calulator = _calculate_return_value.get(name)1418    if return_calulator is not None:1419        try:1420            return_value = return_calulator(mock)1421        except AttributeError:1422            # XXXX why do we return AttributeError here?1423            #      set it as a side_effect instead?1424            return_value = AttributeError(name)1425        method.return_value = return_value1426        return1427    side_effector = _side_effect_methods.get(name)1428    if side_effector is not None:1429        method.side_effect = side_effector(mock)1430class MagicMixin(object):1431    def __init__(self, *args, **kw):1432        _safe_super(MagicMixin, self).__init__(*args, **kw)1433        self._mock_set_magics()1434    def _mock_set_magics(self):1435        these_magics = _magics1436        if self._mock_methods is not None:1437            these_magics = _magics.intersection(self._mock_methods)1438            remove_magics = set()1439            remove_magics = _magics - these_magics1440            for entry in remove_magics:1441                if entry in type(self).__dict__:1442                    # remove unneeded magic methods1443                    delattr(self, entry)1444        # don't overwrite existing attributes if called a second time1445        these_magics = these_magics - set(type(self).__dict__)1446        _type = type(self)1447        for entry in these_magics:1448            setattr(_type, entry, MagicProxy(entry, self))1449class NonCallableMagicMock(MagicMixin, NonCallableMock):1450    """A version of `MagicMock` that isn't callable."""1451    def mock_add_spec(self, spec, spec_set=False):1452        """Add a spec to a mock. `spec` can either be an object or a1453        list of strings. Only attributes on the `spec` can be fetched as1454        attributes from the mock.1455        If `spec_set` is True then only attributes on the spec can be set."""1456        self._mock_add_spec(spec, spec_set)1457        self._mock_set_magics()1458class MagicMock(MagicMixin, Mock):1459    """1460    MagicMock is a subclass of Mock with default implementations1461    of most of the magic methods. You can use MagicMock without having to1462    configure the magic methods yourself.1463    If you use the `spec` or `spec_set` arguments then *only* magic1464    methods that exist in the spec will be created.1465    Attributes and the return value of a `MagicMock` will also be `MagicMocks`.1466    """1467    def mock_add_spec(self, spec, spec_set=False):1468        """Add a spec to a mock. `spec` can either be an object or a1469        list of strings. Only attributes on the `spec` can be fetched as1470        attributes from the mock.1471        If `spec_set` is True then only attributes on the spec can be set."""1472        self._mock_add_spec(spec, spec_set)1473        self._mock_set_magics()1474class MagicProxy(object):1475    def __init__(self, name, parent):1476        self.name = name1477        self.parent = parent1478    def __call__(self, *args, **kwargs):1479        m = self.create_mock()1480        return m(*args, **kwargs)1481    def create_mock(self):1482        entry = self.name1483        parent = self.parent1484        m = parent._get_child_mock(name=entry, _new_name=entry,1485                                   _new_parent=parent)1486        setattr(parent, entry, m)1487        _set_return_value(parent, m, entry)1488        return m1489    def __get__(self, obj, _type=None):1490        return self.create_mock()1491class _ANY(object):1492    "A helper object that compares equal to everything."1493    __hash__ = object.__hash__1494    def __eq__(self, other):1495        return True1496    def __ne__(self, other):1497        return False1498    def __repr__(self):1499        return '<ANY>'1500ANY = _ANY()1501def _format_call_signature(name, args, kwargs):1502    message = '%s(%%s)' % name1503    formatted_args = ''1504    args_string = ', '.join([repr(arg) for arg in args])1505    kwargs_string = ', '.join([1506        '%s=%r' % (key, value) for key, value in sorted(kwargs.items())1507    ])1508    if args_string:1509        formatted_args = args_string1510    if kwargs_string:1511        if formatted_args:1512            formatted_args += ', '1513        formatted_args += kwargs_string1514    return message % formatted_args1515class _Call(tuple):1516    """1517    A tuple for holding the results of a call to a mock, either in the form1518    `(args, kwargs)` or `(name, args, kwargs)`.1519    If args or kwargs are empty then a call tuple will compare equal to1520    a tuple without those values. This makes comparisons less verbose::1521        _Call(('name', (), {})) == ('name',)1522        _Call(('name', (1,), {})) == ('name', (1,))1523        _Call(((), {'a': 'b'})) == ({'a': 'b'},)1524    The `_Call` object provides a useful shortcut for comparing with call::1525        _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)1526        _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)1527    If the _Call has no name then it will match any name.1528    """1529    __hash__ = object.__hash__1530    def __new__(cls, value=(), name=None, parent=None, two=False,1531                from_kall=True):1532        name = ''1533        args = ()1534        kwargs = {}1535        _len = len(value)1536        if _len == 3:1537            name, args, kwargs = value1538        elif _len == 2:1539            first, second = value1540            if isinstance(first, str):1541                name = first1542                if isinstance(second, tuple):1543                    args = second1544                else:1545                    kwargs = second1546            else:1547                args, kwargs = first, second1548        elif _len == 1:1549            value, = value1550            if isinstance(value, str):1551                name = value1552            elif isinstance(value, tuple):1553                args = value1554            else:1555                kwargs = value1556        if two:1557            return tuple.__new__(cls, (args, kwargs))1558        return tuple.__new__(cls, (name, args, kwargs))1559    def __init__(self, value=(), name=None, parent=None, two=False,1560                 from_kall=True):1561        self.name = name1562        self.parent = parent1563        self.from_kall = from_kall1564    def __eq__(self, other):1565        if other is ANY:1566            return True1567        try:1568            len_other = len(other)1569        except TypeError:1570            return False1571        self_name = ''1572        if len(self) == 2:1573            self_args, self_kwargs = self1574        else:1575            self_name, self_args, self_kwargs = self1576        other_name = ''1577        if len_other == 0:1578            other_args, other_kwargs = (), {}1579        elif len_other == 3:1580            other_name, other_args, other_kwargs = other1581        elif len_other == 1:1582            value, = other1583            if isinstance(value, tuple):1584                other_args = value1585                other_kwargs = {}1586            elif isinstance(value, str):1587                other_name = value1588                other_args, other_kwargs = (), {}1589            else:1590                other_args = ()1591                other_kwargs = value1592        else:1593            # len 21594            # could be (name, args) or (name, kwargs) or (args, kwargs)1595            first, second = other1596            if isinstance(first, str):1597                other_name = first1598                if isinstance(second, tuple):1599                    other_args, other_kwargs = second, {}1600                else:1601                    other_args, other_kwargs = (), second1602            else:1603                other_args, other_kwargs = first, second1604        if self_name and other_name != self_name:1605            return False1606        # this order is important for ANY to work!1607        return (other_args, other_kwargs) == (self_args, self_kwargs)1608    def __ne__(self, other):1609        return not self.__eq__(other)1610    def __call__(self, *args, **kwargs):1611        if self.name is None:1612            return _Call(('', args, kwargs), name='()')1613        name = self.name + '()'1614        return _Call((self.name, args, kwargs), name=name, parent=self)1615    def __getattr__(self, attr):1616        if self.name is None:1617            return _Call(name=attr, from_kall=False)1618        name = '%s.%s' % (self.name, attr)1619        return _Call(name=name, parent=self, from_kall=False)1620    def count(self, *args, **kwargs):1621        return self.__getattr__('count')(*args, **kwargs)1622    def index(self, *args, **kwargs):1623        return self.__getattr__('index')(*args, **kwargs)1624    def __repr__(self):1625        if not self.from_kall:1626            name = self.name or 'call'1627            if name.startswith('()'):1628                name = 'call%s' % name1629            return name1630        if len(self) == 2:1631            name = 'call'1632            args, kwargs = self1633        else:1634            name, args, kwargs = self1635            if not name:1636                name = 'call'1637            elif not name.startswith('()'):1638                name = 'call.%s' % name1639            else:1640                name = 'call%s' % name1641        return _format_call_signature(name, args, kwargs)1642    def call_list(self):1643        """For a call object that represents multiple calls, `call_list`1644        returns a list of all the intermediate calls as well as the1645        final call."""1646        vals = []1647        thing = self1648        while thing is not None:1649            if thing.from_kall:1650                vals.append(thing)1651            thing = thing.parent1652        return _CallList(reversed(vals))1653call = _Call(from_kall=False)1654def create_autospec(spec, spec_set=False, instance=False, _parent=None,1655                    _name=None, **kwargs):...mock.py
Source:mock.py  
...510            del self._mock_children[name]511        self._mock_children[name] = _deleted512    def _format_mock_call_signature(self, args, kwargs):513        name = self._mock_name or 'mock'514        return _format_call_signature(name, args, kwargs)515    def _format_mock_failure_message(self, args, kwargs):516        message = 'Expected call: %s\nActual call: %s'517        expected_string = self._format_mock_call_signature(args, kwargs)518        call_args = self.call_args519        if len(call_args) == 3:520            call_args = call_args[1:]521        actual_string = self._format_mock_call_signature(*call_args)522        return message % (expected_string, actual_string)523    def assert_called_with(_mock_self, *args, **kwargs):524        self = _mock_self525        if self.call_args is None:526            expected = self._format_mock_call_signature(args, kwargs)527            raise AssertionError('Expected call: %s\nNot called' % (expected,))528        if self.call_args != (args, kwargs):529            msg = self._format_mock_failure_message(args, kwargs)530            raise AssertionError(msg)531    def assert_called_once_with(_mock_self, *args, **kwargs):532        self = _mock_self533        if not self.call_count == 1:534            msg = 'Expected to be called once. Called %s times.' % self.call_count535            raise AssertionError(msg)536        return self.assert_called_with(*args, **kwargs)537    def assert_has_calls(self, calls, any_order = False):538        if not any_order:539            if calls not in self.mock_calls:540                raise AssertionError('Calls not found.\nExpected: %r\nActual: %r' % (calls, self.mock_calls))541            return542        all_calls = list(self.mock_calls)543        not_found = []544        for kall in calls:545            try:546                all_calls.remove(kall)547            except ValueError:548                not_found.append(kall)549        if not_found:550            raise AssertionError('%r not all found in call list' % (tuple(not_found),))551    def assert_any_call(self, *args, **kwargs):552        kall = call(*args, **kwargs)553        if kall not in self.call_args_list:554            expected_string = self._format_mock_call_signature(args, kwargs)555            raise AssertionError('%s call not found' % expected_string)556    def _get_child_mock(self, **kw):557        _type = type(self)558        if not issubclass(_type, CallableMixin):559            if issubclass(_type, NonCallableMagicMock):560                klass = MagicMock561            elif issubclass(_type, NonCallableMock):562                klass = Mock563        else:564            klass = _type.__mro__[1]565        return klass(**kw)566def _try_iter(obj):567    if obj is None:568        return obj569    if _is_exception(obj):570        return obj571    if _callable(obj):572        return obj573    try:574        return iter(obj)575    except TypeError:576        return obj577class CallableMixin(Base):578    def __init__(self, spec = None, side_effect = None, return_value = DEFAULT, wraps = None, name = None, spec_set = None, parent = None, _spec_state = None, _new_name = '', _new_parent = None, **kwargs):579        self.__dict__['_mock_return_value'] = return_value580        _super(CallableMixin, self).__init__(spec, wraps, name, spec_set, parent, _spec_state, _new_name, _new_parent, **kwargs)581        self.side_effect = side_effect582    def _mock_check_sig(self, *args, **kwargs):583        pass584    def __call__(_mock_self, *args, **kwargs):585        _mock_self._mock_check_sig(*args, **kwargs)586        return _mock_self._mock_call(*args, **kwargs)587    def _mock_call(_mock_self, *args, **kwargs):588        self = _mock_self589        self.called = True590        self.call_count += 1591        self.call_args = _Call((args, kwargs), two=True)592        self.call_args_list.append(_Call((args, kwargs), two=True))593        _new_name = self._mock_new_name594        _new_parent = self._mock_new_parent595        self.mock_calls.append(_Call(('', args, kwargs)))596        seen = set()597        skip_next_dot = _new_name == '()'598        do_method_calls = self._mock_parent is not None599        name = self._mock_name600        while _new_parent is not None:601            this_mock_call = _Call((_new_name, args, kwargs))602            if _new_parent._mock_new_name:603                dot = '.'604                if skip_next_dot:605                    dot = ''606                skip_next_dot = False607                if _new_parent._mock_new_name == '()':608                    skip_next_dot = True609                _new_name = _new_parent._mock_new_name + dot + _new_name610            if do_method_calls:611                if _new_name == name:612                    this_method_call = this_mock_call613                else:614                    this_method_call = _Call((name, args, kwargs))615                _new_parent.method_calls.append(this_method_call)616                do_method_calls = _new_parent._mock_parent is not None617                if do_method_calls:618                    name = _new_parent._mock_name + '.' + name619            _new_parent.mock_calls.append(this_mock_call)620            _new_parent = _new_parent._mock_new_parent621            _new_parent_id = id(_new_parent)622            if _new_parent_id in seen:623                break624            seen.add(_new_parent_id)625        ret_val = DEFAULT626        effect = self.side_effect627        if effect is not None:628            if _is_exception(effect):629                raise effect630            if not _callable(effect):631                result = next(effect)632                if _is_exception(result):633                    raise result634                return result635            ret_val = effect(*args, **kwargs)636            if ret_val is DEFAULT:637                ret_val = self.return_value638        if self._mock_wraps is not None and self._mock_return_value is DEFAULT:639            return self._mock_wraps(*args, **kwargs)640        if ret_val is DEFAULT:641            ret_val = self.return_value642        return ret_val643class Mock(CallableMixin, NonCallableMock):644    pass645def _dot_lookup(thing, comp, import_path):646    try:647        return getattr(thing, comp)648    except AttributeError:649        __import__(import_path)650        return getattr(thing, comp)651def _importer(target):652    components = target.split('.')653    import_path = components.pop(0)654    thing = __import__(import_path)655    for comp in components:656        import_path += '.%s' % comp657        thing = _dot_lookup(thing, comp, import_path)658    return thing659def _is_started(patcher):660    return hasattr(patcher, 'is_local')661class _patch(object):662    attribute_name = None663    _active_patches = set()664    def __init__(self, getter, attribute, new, spec, create, spec_set, autospec, new_callable, kwargs):665        if new_callable is not None:666            if new is not DEFAULT:667                raise ValueError("Cannot use 'new' and 'new_callable' together")668            if autospec is not None:669                raise ValueError("Cannot use 'autospec' and 'new_callable' together")670        self.getter = getter671        self.attribute = attribute672        self.new = new673        self.new_callable = new_callable674        self.spec = spec675        self.create = create676        self.has_local = False677        self.spec_set = spec_set678        self.autospec = autospec679        self.kwargs = kwargs680        self.additional_patchers = []681    def copy(self):682        patcher = _patch(self.getter, self.attribute, self.new, self.spec, self.create, self.spec_set, self.autospec, self.new_callable, self.kwargs)683        patcher.attribute_name = self.attribute_name684        patcher.additional_patchers = [ p.copy() for p in self.additional_patchers ]685        return patcher686    def __call__(self, func):687        if isinstance(func, ClassTypes):688            return self.decorate_class(func)689        return self.decorate_callable(func)690    def decorate_class(self, klass):691        for attr in dir(klass):692            if not attr.startswith(patch.TEST_PREFIX):693                continue694            attr_value = getattr(klass, attr)695            if not hasattr(attr_value, '__call__'):696                continue697            patcher = self.copy()698            setattr(klass, attr, patcher(attr_value))699        return klass700    def decorate_callable(self, func):701        if hasattr(func, 'patchings'):702            func.patchings.append(self)703            return func704        @wraps(func)705        def patched(*args, **keywargs):706            extra_args = []707            entered_patchers = []708            exc_info = tuple()709            try:710                for patching in patched.patchings:711                    arg = patching.__enter__()712                    entered_patchers.append(patching)713                    if patching.attribute_name is not None:714                        keywargs.update(arg)715                    elif patching.new is DEFAULT:716                        extra_args.append(arg)717                args += tuple(extra_args)718                return func(*args, **keywargs)719            except:720                if patching not in entered_patchers and _is_started(patching):721                    entered_patchers.append(patching)722                exc_info = sys.exc_info()723                raise724            finally:725                for patching in reversed(entered_patchers):726                    patching.__exit__(*exc_info)727        patched.patchings = [self]728        if hasattr(func, 'func_code'):729            patched.compat_co_firstlineno = getattr(func, 'compat_co_firstlineno', func.func_code.co_firstlineno)730        return patched731    def get_original(self):732        target = self.getter()733        name = self.attribute734        original = DEFAULT735        local = False736        try:737            original = target.__dict__[name]738        except (AttributeError, KeyError):739            original = getattr(target, name, DEFAULT)740        else:741            local = True742        if not self.create and original is DEFAULT:743            raise AttributeError('%s does not have the attribute %r' % (target, name))744        return (original, local)745    def __enter__(self):746        new, spec, spec_set = self.new, self.spec, self.spec_set747        autospec, kwargs = self.autospec, self.kwargs748        new_callable = self.new_callable749        self.target = self.getter()750        if spec is False:751            spec = None752        if spec_set is False:753            spec_set = None754        if autospec is False:755            autospec = None756        if spec is not None and autospec is not None:757            raise TypeError("Can't specify spec and autospec")758        if (spec is not None or autospec is not None) and spec_set not in (True, None):759            raise TypeError("Can't provide explicit spec_set *and* spec or autospec")760        original, local = self.get_original()761        if new is DEFAULT and autospec is None:762            inherit = False763            if spec is True:764                spec = original765                if spec_set is True:766                    spec_set = original767                    spec = None768            elif spec is not None:769                if spec_set is True:770                    spec_set = spec771                    spec = None772            elif spec_set is True:773                spec_set = original774            if spec is not None or spec_set is not None:775                if original is DEFAULT:776                    raise TypeError("Can't use 'spec' with create=True")777                if isinstance(original, ClassTypes):778                    inherit = True779            Klass = MagicMock780            _kwargs = {}781            if new_callable is not None:782                Klass = new_callable783            elif spec is not None or spec_set is not None:784                this_spec = spec785                if spec_set is not None:786                    this_spec = spec_set787                if _is_list(this_spec):788                    not_callable = '__call__' not in this_spec789                else:790                    not_callable = not _callable(this_spec)791                if not_callable:792                    Klass = NonCallableMagicMock793            if spec is not None:794                _kwargs['spec'] = spec795            if spec_set is not None:796                _kwargs['spec_set'] = spec_set797            if isinstance(Klass, type) and issubclass(Klass, NonCallableMock) and self.attribute:798                _kwargs['name'] = self.attribute799            _kwargs.update(kwargs)800            new = Klass(**_kwargs)801            if inherit and _is_instance_mock(new):802                this_spec = spec803                if spec_set is not None:804                    this_spec = spec_set805                if not _is_list(this_spec) and not _instance_callable(this_spec):806                    Klass = NonCallableMagicMock807                _kwargs.pop('name')808                new.return_value = Klass(_new_parent=new, _new_name='()', **_kwargs)809        elif autospec is not None:810            if new is not DEFAULT:811                raise TypeError("autospec creates the mock for you. Can't specify autospec and new.")812            if original is DEFAULT:813                raise TypeError("Can't use 'autospec' with create=True")814            spec_set = bool(spec_set)815            if autospec is True:816                autospec = original817            new = create_autospec(autospec, spec_set=spec_set, _name=self.attribute, **kwargs)818        elif kwargs:819            raise TypeError("Can't pass kwargs to a mock we aren't creating")820        new_attr = new821        self.temp_original = original822        self.is_local = local823        setattr(self.target, self.attribute, new_attr)824        if self.attribute_name is not None:825            extra_args = {}826            if self.new is DEFAULT:827                extra_args[self.attribute_name] = new828            for patching in self.additional_patchers:829                arg = patching.__enter__()830                if patching.new is DEFAULT:831                    extra_args.update(arg)832            return extra_args833        return new834    def __exit__(self, *exc_info):835        if not _is_started(self):836            raise RuntimeError('stop called on unstarted patcher')837        if self.is_local and self.temp_original is not DEFAULT:838            setattr(self.target, self.attribute, self.temp_original)839        else:840            delattr(self.target, self.attribute)841            if not self.create and not hasattr(self.target, self.attribute):842                setattr(self.target, self.attribute, self.temp_original)843        del self.temp_original844        del self.is_local845        del self.target846        for patcher in reversed(self.additional_patchers):847            if _is_started(patcher):848                patcher.__exit__(*exc_info)849    def start(self):850        result = self.__enter__()851        self._active_patches.add(self)852        return result853    def stop(self):854        self._active_patches.discard(self)855        return self.__exit__()856def _get_target(target):857    try:858        target, attribute = target.rsplit('.', 1)859    except (TypeError, ValueError):860        raise TypeError('Need a valid target to patch. You supplied: %r' % (target,))861    getter = lambda : _importer(target)862    return (getter, attribute)863def _patch_object(target, attribute, new = DEFAULT, spec = None, create = False, spec_set = None, autospec = None, new_callable = None, **kwargs):864    getter = lambda : target865    return _patch(getter, attribute, new, spec, create, spec_set, autospec, new_callable, kwargs)866def _patch_multiple(target, spec = None, create = False, spec_set = None, autospec = None, new_callable = None, **kwargs):867    if type(target) in (unicode, str):868        getter = lambda : _importer(target)869    else:870        getter = lambda : target871    if not kwargs:872        raise ValueError('Must supply at least one keyword argument with patch.multiple')873    items = list(kwargs.items())874    attribute, new = items[0]875    patcher = _patch(getter, attribute, new, spec, create, spec_set, autospec, new_callable, {})876    patcher.attribute_name = attribute877    for attribute, new in items[1:]:878        this_patcher = _patch(getter, attribute, new, spec, create, spec_set, autospec, new_callable, {})879        this_patcher.attribute_name = attribute880        patcher.additional_patchers.append(this_patcher)881    return patcher882def patch(target, new = DEFAULT, spec = None, create = False, spec_set = None, autospec = None, new_callable = None, **kwargs):883    getter, attribute = _get_target(target)884    return _patch(getter, attribute, new, spec, create, spec_set, autospec, new_callable, kwargs)885class _patch_dict(object):886    def __init__(self, in_dict, values = (), clear = False, **kwargs):887        if isinstance(in_dict, basestring):888            in_dict = _importer(in_dict)889        self.in_dict = in_dict890        self.values = dict(values)891        self.values.update(kwargs)892        self.clear = clear893        self._original = None894    def __call__(self, f):895        if isinstance(f, ClassTypes):896            return self.decorate_class(f)897        @wraps(f)898        def _inner(*args, **kw):899            self._patch_dict()900            try:901                return f(*args, **kw)902            finally:903                self._unpatch_dict()904        return _inner905    def decorate_class(self, klass):906        for attr in dir(klass):907            attr_value = getattr(klass, attr)908            if attr.startswith(patch.TEST_PREFIX) and hasattr(attr_value, '__call__'):909                decorator = _patch_dict(self.in_dict, self.values, self.clear)910                decorated = decorator(attr_value)911                setattr(klass, attr, decorated)912        return klass913    def __enter__(self):914        self._patch_dict()915    def _patch_dict(self):916        values = self.values917        in_dict = self.in_dict918        clear = self.clear919        try:920            original = in_dict.copy()921        except AttributeError:922            original = {}923            for key in in_dict:924                original[key] = in_dict[key]925        self._original = original926        if clear:927            _clear_dict(in_dict)928        try:929            in_dict.update(values)930        except AttributeError:931            for key in values:932                in_dict[key] = values[key]933    def _unpatch_dict(self):934        in_dict = self.in_dict935        original = self._original936        _clear_dict(in_dict)937        try:938            in_dict.update(original)939        except AttributeError:940            for key in original:941                in_dict[key] = original[key]942    def __exit__(self, *args):943        self._unpatch_dict()944        return False945    start = __enter__946    stop = __exit__947def _clear_dict(in_dict):948    try:949        in_dict.clear()950    except AttributeError:951        keys = list(in_dict)952        for key in keys:953            del in_dict[key]954def _patch_stopall():955    for patch in list(_patch._active_patches):956        patch.stop()957patch.object = _patch_object958patch.dict = _patch_dict959patch.multiple = _patch_multiple960patch.stopall = _patch_stopall961patch.TEST_PREFIX = 'test'962magic_methods = 'lt le gt ge eq ne getitem setitem delitem len contains iter hash str sizeof enter exit divmod neg pos abs invert complex int float index trunc floor ceil '963numerics = 'add sub mul div floordiv mod lshift rshift and xor or pow '964inplace = ' '.join(('i%s' % n for n in numerics.split()))965right = ' '.join(('r%s' % n for n in numerics.split()))966extra = ''967if inPy3k:968    extra = 'bool next '969else:970    extra = 'unicode long nonzero oct hex truediv rtruediv '971_non_defaults = set(('__%s__' % method for method in ['cmp',972 'getslice',973 'setslice',974 'coerce',975 'subclasses',976 'format',977 'get',978 'set',979 'delete',980 'reversed',981 'missing',982 'reduce',983 'reduce_ex',984 'getinitargs',985 'getnewargs',986 'getstate',987 'setstate',988 'getformat',989 'setformat',990 'repr',991 'dir']))992def _get_method(name, func):993    def method(self, *args, **kw):994        return func(self, *args, **kw)995    method.__name__ = name996    return method997_magics = set(('__%s__' % method for method in ' '.join([magic_methods,998 numerics,999 inplace,1000 right,1001 extra]).split()))1002_all_magics = _magics | _non_defaults1003_unsupported_magics = set(['__getattr__',1004 '__setattr__',1005 '__init__',1006 '__new__',1007 '__prepare____instancecheck__',1008 '__subclasscheck__',1009 '__del__'])1010_calculate_return_value = {'__hash__': lambda self: object.__hash__(self),1011 '__str__': lambda self: object.__str__(self),1012 '__sizeof__': lambda self: object.__sizeof__(self),1013 '__unicode__': lambda self: unicode(object.__str__(self))}1014_return_values = {'__lt__': NotImplemented,1015 '__gt__': NotImplemented,1016 '__le__': NotImplemented,1017 '__ge__': NotImplemented,1018 '__int__': 1,1019 '__contains__': False,1020 '__len__': 0,1021 '__exit__': False,1022 '__complex__': 1j,1023 '__float__': 1.0,1024 '__bool__': True,1025 '__nonzero__': True,1026 '__oct__': '1',1027 '__hex__': '0x1',1028 '__long__': long(1),1029 '__index__': 1}1030def _get_eq(self):1031    def __eq__(other):1032        ret_val = self.__eq__._mock_return_value1033        if ret_val is not DEFAULT:1034            return ret_val1035        return self is other1036    return __eq__1037def _get_ne(self):1038    def __ne__(other):1039        if self.__ne__._mock_return_value is not DEFAULT:1040            return DEFAULT1041        return self is not other1042    return __ne__1043def _get_iter(self):1044    def __iter__():1045        ret_val = self.__iter__._mock_return_value1046        if ret_val is DEFAULT:1047            return iter([])1048        return iter(ret_val)1049    return __iter__1050_side_effect_methods = {'__eq__': _get_eq,1051 '__ne__': _get_ne,1052 '__iter__': _get_iter}1053def _set_return_value(mock, method, name):1054    fixed = _return_values.get(name, DEFAULT)1055    if fixed is not DEFAULT:1056        method.return_value = fixed1057        return1058    return_calulator = _calculate_return_value.get(name)1059    if return_calulator is not None:1060        try:1061            return_value = return_calulator(mock)1062        except AttributeError:1063            return_value = AttributeError(name)1064        method.return_value = return_value1065        return1066    side_effector = _side_effect_methods.get(name)1067    if side_effector is not None:1068        method.side_effect = side_effector(mock)1069class MagicMixin(object):1070    def __init__(self, *args, **kw):1071        _super(MagicMixin, self).__init__(*args, **kw)1072        self._mock_set_magics()1073    def _mock_set_magics(self):1074        these_magics = _magics1075        if self._mock_methods is not None:1076            these_magics = _magics.intersection(self._mock_methods)1077            remove_magics = set()1078            remove_magics = _magics - these_magics1079            for entry in remove_magics:1080                if entry in type(self).__dict__:1081                    delattr(self, entry)1082        these_magics = these_magics - set(type(self).__dict__)1083        _type = type(self)1084        for entry in these_magics:1085            setattr(_type, entry, MagicProxy(entry, self))1086class NonCallableMagicMock(MagicMixin, NonCallableMock):1087    def mock_add_spec(self, spec, spec_set = False):1088        self._mock_add_spec(spec, spec_set)1089        self._mock_set_magics()1090class MagicMock(MagicMixin, Mock):1091    def mock_add_spec(self, spec, spec_set = False):1092        self._mock_add_spec(spec, spec_set)1093        self._mock_set_magics()1094class MagicProxy(object):1095    def __init__(self, name, parent):1096        self.name = name1097        self.parent = parent1098    def __call__(self, *args, **kwargs):1099        m = self.create_mock()1100        return m(*args, **kwargs)1101    def create_mock(self):1102        entry = self.name1103        parent = self.parent1104        m = parent._get_child_mock(name=entry, _new_name=entry, _new_parent=parent)1105        setattr(parent, entry, m)1106        _set_return_value(parent, m, entry)1107        return m1108    def __get__(self, obj, _type = None):1109        return self.create_mock()1110class _ANY(object):1111    def __eq__(self, other):1112        return True1113    def __ne__(self, other):1114        return False1115    def __repr__(self):1116        return '<ANY>'1117ANY = _ANY()1118def _format_call_signature(name, args, kwargs):1119    message = '%s(%%s)' % name1120    formatted_args = ''1121    args_string = ', '.join([ repr(arg) for arg in args ])1122    kwargs_string = ', '.join([ '%s=%r' % (key, value) for key, value in kwargs.items() ])1123    if args_string:1124        formatted_args = args_string1125    if kwargs_string:1126        if formatted_args:1127            formatted_args += ', '1128        formatted_args += kwargs_string1129    return message % formatted_args1130class _Call(tuple):1131    def __new__(cls, value = (), name = None, parent = None, two = False, from_kall = True):1132        name = ''1133        args = ()1134        kwargs = {}1135        _len = len(value)1136        if _len == 3:1137            name, args, kwargs = value1138        elif _len == 2:1139            first, second = value1140            if isinstance(first, basestring):1141                name = first1142                if isinstance(second, tuple):1143                    args = second1144                else:1145                    kwargs = second1146            else:1147                args, kwargs = first, second1148        elif _len == 1:1149            value, = value1150            if isinstance(value, basestring):1151                name = value1152            elif isinstance(value, tuple):1153                args = value1154            else:1155                kwargs = value1156        if two:1157            return tuple.__new__(cls, (args, kwargs))1158        return tuple.__new__(cls, (name, args, kwargs))1159    def __init__(self, value = (), name = None, parent = None, two = False, from_kall = True):1160        self.name = name1161        self.parent = parent1162        self.from_kall = from_kall1163    def __eq__(self, other):1164        if other is ANY:1165            return True1166        try:1167            len_other = len(other)1168        except TypeError:1169            return False1170        self_name = ''1171        if len(self) == 2:1172            self_args, self_kwargs = self1173        else:1174            self_name, self_args, self_kwargs = self1175        other_name = ''1176        if len_other == 0:1177            other_args, other_kwargs = (), {}1178        elif len_other == 3:1179            other_name, other_args, other_kwargs = other1180        elif len_other == 1:1181            value, = other1182            if isinstance(value, tuple):1183                other_args = value1184                other_kwargs = {}1185            elif isinstance(value, basestring):1186                other_name = value1187                other_args, other_kwargs = (), {}1188            else:1189                other_args = ()1190                other_kwargs = value1191        else:1192            first, second = other1193            if isinstance(first, basestring):1194                other_name = first1195                if isinstance(second, tuple):1196                    other_args, other_kwargs = second, {}1197                else:1198                    other_args, other_kwargs = (), second1199            else:1200                other_args, other_kwargs = first, second1201        if self_name and other_name != self_name:1202            return False1203        return (other_args, other_kwargs) == (self_args, self_kwargs)1204    def __ne__(self, other):1205        return not self.__eq__(other)1206    def __call__(self, *args, **kwargs):1207        if self.name is None:1208            return _Call(('', args, kwargs), name='()')1209        name = self.name + '()'1210        return _Call((self.name, args, kwargs), name=name, parent=self)1211    def __getattr__(self, attr):1212        if self.name is None:1213            return _Call(name=attr, from_kall=False)1214        name = '%s.%s' % (self.name, attr)1215        return _Call(name=name, parent=self, from_kall=False)1216    def __repr__(self):1217        if not self.from_kall:1218            name = self.name or 'call'1219            if name.startswith('()'):1220                name = 'call%s' % name1221            return name1222        if len(self) == 2:1223            name = 'call'1224            args, kwargs = self1225        else:1226            name, args, kwargs = self1227            if not name:1228                name = 'call'1229            elif not name.startswith('()'):1230                name = 'call.%s' % name1231            else:1232                name = 'call%s' % name1233        return _format_call_signature(name, args, kwargs)1234    def call_list(self):1235        vals = []1236        thing = self1237        while thing is not None:1238            if thing.from_kall:1239                vals.append(thing)1240            thing = thing.parent1241        return _CallList(reversed(vals))1242call = _Call(from_kall=False)1243def create_autospec(spec, spec_set = False, instance = False, _parent = None, _name = None, **kwargs):1244    if _is_list(spec):1245        spec = type(spec)1246    is_type = isinstance(spec, ClassTypes)1247    _kwargs = {'spec': spec}...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
