summaryrefslogtreecommitdiff
path: root/fixtures
diff options
context:
space:
mode:
Diffstat (limited to 'fixtures')
-rw-r--r--fixtures/_fixtures/monkeypatch.py26
-rw-r--r--fixtures/tests/_fixtures/test_monkeypatch.py4
2 files changed, 22 insertions, 8 deletions
diff --git a/fixtures/_fixtures/monkeypatch.py b/fixtures/_fixtures/monkeypatch.py
index 7db3671..4198b4f 100644
--- a/fixtures/_fixtures/monkeypatch.py
+++ b/fixtures/_fixtures/monkeypatch.py
@@ -23,6 +23,23 @@ import types
from fixtures import Fixture
+def _setattr(obj, name, value):
+ """Handle some corner cases when calling setattr.
+
+ setattr transforms a function into instancemethod, so where appropriate
+ value needs to be wrapped with staticmethod().
+ """
+ if sys.version_info[0] == 2:
+ class_types = (type, types.ClassType)
+ else:
+ # All classes are <class 'type'> in Python 3
+ class_types = type
+ if (isinstance(obj, class_types) and
+ isinstance(value, types.FunctionType)):
+ value = staticmethod(value)
+ setattr(obj, name, value)
+
+
class MonkeyPatch(Fixture):
"""Replace or delete an attribute."""
@@ -60,16 +77,11 @@ class MonkeyPatch(Fixture):
if old_value is not sentinel:
delattr(current, attribute)
else:
- setattr(current, attribute, self.new_value)
+ _setattr(current, attribute, self.new_value)
if old_value is sentinel:
self.addCleanup(self._safe_delete, current, attribute)
else:
- # Python 2's setattr transforms function into instancemethod
- if (sys.version_info[0] == 2 and
- isinstance(current, (type, types.ClassType)) and
- isinstance(old_value, types.FunctionType)):
- old_value = staticmethod(old_value)
- self.addCleanup(setattr, current, attribute, old_value)
+ self.addCleanup(_setattr, current, attribute, old_value)
def _safe_delete(self, obj, attribute):
"""Delete obj.attribute handling the case where its missing."""
diff --git a/fixtures/tests/_fixtures/test_monkeypatch.py b/fixtures/tests/_fixtures/test_monkeypatch.py
index 1a84d7f..81927c8 100644
--- a/fixtures/tests/_fixtures/test_monkeypatch.py
+++ b/fixtures/tests/_fixtures/test_monkeypatch.py
@@ -78,6 +78,8 @@ class TestMonkeyPatch(testtools.TestCase, TestWithFixtures):
'fixtures.tests._fixtures.test_monkeypatch.C.foo',
bar)
with fixture:
- pass
+ C.foo()
+ C().foo()
self.assertEqual(oldfoo, C.foo)
+ self.assertEqual(oldfoo, C().foo)