diff options
| author | Antoine Pitrou <solipsis@pitrou.net> | 2011-03-15 20:11:27 (GMT) |
|---|---|---|
| committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-03-15 20:11:27 (GMT) |
| commit | f134dceeae096db3e6f343954aca1cf0e0cc7922 (patch) | |
| tree | cfcca1d2395691c033ab3dbe4faefb95c77c96ce /Lib/test/support.py | |
| parent | 709ac7b0a21690d804ac454e106015026e1eaffc (diff) | |
| parent | e870623e965ca017d32228486662b285d7b81ed0 (diff) | |
| download | cpython-f134dceeae096db3e6f343954aca1cf0e0cc7922.zip cpython-f134dceeae096db3e6f343954aca1cf0e0cc7922.tar.gz cpython-f134dceeae096db3e6f343954aca1cf0e0cc7922.tar.bz2 | |
Merge
Diffstat (limited to 'Lib/test/support.py')
| -rw-r--r-- | Lib/test/support.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py index 7a43f97..8d8e187 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1467,3 +1467,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) |
