mirror of
https://github.com/python/cpython.git
synced 2025-11-10 10:32:04 +00:00
[3.14] gh-135368: Fix mocks on dataclass specs with instance=True (GH-135421) (#135503)
gh-135368: Fix mocks on dataclass specs with `instance=True` (GH-135421)
* gh-135368: Fix mocks on dataclass specs with `instance=True`
* Extend dataclass mock_methods
---------
(cherry picked from commit c8319a3fea)
Co-authored-by: sobolevn <mail@sobolevn.me>
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
parent
7499bcd530
commit
79df5d1c54
3 changed files with 34 additions and 2 deletions
|
|
@ -569,6 +569,11 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False,
|
|||
__dict__['_mock_methods'] = spec
|
||||
__dict__['_spec_asyncs'] = _spec_asyncs
|
||||
|
||||
def _mock_extend_spec_methods(self, spec_methods):
|
||||
methods = self.__dict__.get('_mock_methods') or []
|
||||
methods.extend(spec_methods)
|
||||
self.__dict__['_mock_methods'] = methods
|
||||
|
||||
def __get_return_value(self):
|
||||
ret = self._mock_return_value
|
||||
if self._mock_delegate is not None:
|
||||
|
|
@ -2766,14 +2771,16 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
|
|||
raise InvalidSpecError(f'Cannot autospec a Mock object. '
|
||||
f'[object={spec!r}]')
|
||||
is_async_func = _is_async_func(spec)
|
||||
_kwargs = {'spec': spec}
|
||||
|
||||
entries = [(entry, _missing) for entry in dir(spec)]
|
||||
if is_type and instance and is_dataclass(spec):
|
||||
is_dataclass_spec = True
|
||||
dataclass_fields = fields(spec)
|
||||
entries.extend((f.name, f.type) for f in dataclass_fields)
|
||||
_kwargs = {'spec': [f.name for f in dataclass_fields]}
|
||||
dataclass_spec_list = [f.name for f in dataclass_fields]
|
||||
else:
|
||||
_kwargs = {'spec': spec}
|
||||
is_dataclass_spec = False
|
||||
|
||||
if spec_set:
|
||||
_kwargs = {'spec_set': spec}
|
||||
|
|
@ -2810,6 +2817,8 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
|
|||
|
||||
mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
|
||||
name=_name, **_kwargs)
|
||||
if is_dataclass_spec:
|
||||
mock._mock_extend_spec_methods(dataclass_spec_list)
|
||||
|
||||
if isinstance(spec, FunctionTypes):
|
||||
# should only happen at the top level because we don't
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue