summaryrefslogtreecommitdiff
path: root/Lib/test/support.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-03-15 21:11:04 +0100
committerAntoine Pitrou <solipsis@pitrou.net>2011-03-15 21:11:04 +0100
commit87541aa296470d10608c3160ec306e436b749e41 (patch)
tree526b43151ae40529090943f3fddaf2eb4b5f4fa8 /Lib/test/support.py
parentec4b44b2dac099bd3b3806be3f5d5b550c4356dc (diff)
parent2c50a09ac47e701768a4e20f8a03d17263e8db8f (diff)
downloadcpython-git-87541aa296470d10608c3160ec306e436b749e41.tar.gz
Merge
Diffstat (limited to 'Lib/test/support.py')
-rw-r--r--Lib/test/support.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 9fb3ee00c1..bef7161e9a 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -1096,3 +1096,36 @@ def strip_python_stderr(stderr):
"""
stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
return stderr
+
+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)