mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
Merge fix for issue #11501
This commit is contained in:
commit
0e63f59492
6 changed files with 111 additions and 14 deletions
|
@ -1475,3 +1475,36 @@ def skip_unless_symlink(test):
|
|||
ok = can_symlink()
|
||||
msg = "Requires functional symlink implementation"
|
||||
return test if ok else unittest.skip(msg)(test)
|
||||
|
||||
def patch(test_instance, object_to_patch, attr_name, new_value):
|
||||
"""Override 'object_to_patch'.'attr_name' with 'new_value'.
|
||||
|
||||
Also, add a cleanup procedure to 'test_instance' to restore
|
||||
'object_to_patch' value for 'attr_name'.
|
||||
The 'attr_name' should be a valid attribute for 'object_to_patch'.
|
||||
|
||||
"""
|
||||
# check that 'attr_name' is a real attribute for 'object_to_patch'
|
||||
# will raise AttributeError if it does not exist
|
||||
getattr(object_to_patch, attr_name)
|
||||
|
||||
# keep a copy of the old value
|
||||
attr_is_local = False
|
||||
try:
|
||||
old_value = object_to_patch.__dict__[attr_name]
|
||||
except (AttributeError, KeyError):
|
||||
old_value = getattr(object_to_patch, attr_name, None)
|
||||
else:
|
||||
attr_is_local = True
|
||||
|
||||
# restore the value when the test is done
|
||||
def cleanup():
|
||||
if attr_is_local:
|
||||
setattr(object_to_patch, attr_name, old_value)
|
||||
else:
|
||||
delattr(object_to_patch, attr_name)
|
||||
|
||||
test_instance.addCleanup(cleanup)
|
||||
|
||||
# actually override the attribute
|
||||
setattr(object_to_patch, attr_name, new_value)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue