mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-135368: Fix mocks on dataclass specs with instance=True (#135421)
				
					
				
			* gh-135368: Fix mocks on dataclass specs with `instance=True` * Extend dataclass mock_methods --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									c2bb3f9843
								
							
						
					
					
						commit
						c8319a3fea
					
				
					 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
	
	 sobolevn
						sobolevn