summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmiddlek <smiddlek@b1010a0a-674b-0410-b734-77272b80c875>2012-11-16 19:17:52 +0000
committersmiddlek <smiddlek@b1010a0a-674b-0410-b734-77272b80c875>2012-11-16 19:17:52 +0000
commit160491d0384285698d726b1af21277f336107f51 (patch)
treeeac4e643847865508bdf7ff2db51525650a2530e
parent836982b46ab9e1e60b12009aa5abab384131c697 (diff)
downloadmox-160491d0384285698d726b1af21277f336107f51.tar.gz
Patch for Issue #47, provided by gps@google.comHEADmaster
git-svn-id: http://pymox.googlecode.com/svn/trunk@75 b1010a0a-674b-0410-b734-77272b80c875
-rwxr-xr-xmox.py6
-rwxr-xr-xmox_test.py34
-rwxr-xr-xmox_test_helper.py19
3 files changed, 59 insertions, 0 deletions
diff --git a/mox.py b/mox.py
index f250187..48f6391 100755
--- a/mox.py
+++ b/mox.py
@@ -61,6 +61,10 @@ Suggested usage / workflow:
my_mox.VerifyAll()
"""
+try:
+ import abc
+except ImportError:
+ abc = None # Python 2.5 and earlier
from collections import deque
import difflib
import inspect
@@ -260,6 +264,8 @@ class Mox(object):
# A list of types that may be stubbed out with a MockObjectFactory.
_USE_MOCK_FACTORY = [types.ClassType, types.ObjectType, types.TypeType]
+ if abc:
+ _USE_MOCK_FACTORY.append(abc.ABCMeta)
def __init__(self):
"""Initialize a new Mox."""
diff --git a/mox_test.py b/mox_test.py
index 89efd48..3e2d9b6 100755
--- a/mox_test.py
+++ b/mox_test.py
@@ -19,6 +19,7 @@
import cStringIO
import unittest
import re
+import sys
import mox
@@ -1898,6 +1899,39 @@ class MoxTest(unittest.TestCase):
self.assertEquals('mock', actual_one)
self.assertEquals('called mock', actual_two)
+ try:
+ import abc
+ # I'd use the unittest skipping decorators for this but I want to support
+ # older versions of Python that don't have them.
+ def testStubOutClass_ABCMeta(self):
+ self.mox.StubOutClassWithMocks(mox_test_helper,
+ 'CallableSubclassOfMyDictABC')
+ mock_foo = mox_test_helper.CallableSubclassOfMyDictABC(foo='!mock bar')
+ mock_foo['foo'].AndReturn('mock bar')
+ mock_spam = mox_test_helper.CallableSubclassOfMyDictABC(spam='!mock eggs')
+ mock_spam('beans').AndReturn('called mock')
+
+ self.mox.ReplayAll()
+
+ foo = mox_test_helper.CallableSubclassOfMyDictABC(foo='!mock bar')
+ actual_foo_bar = foo['foo']
+
+ spam = mox_test_helper.CallableSubclassOfMyDictABC(spam='!mock eggs')
+ actual_spam = spam('beans')
+
+ self.mox.VerifyAll()
+ self.mox.UnsetStubs()
+
+ # Verify the correct mocks were returned
+ self.assertEquals(mock_foo, foo)
+ self.assertEquals(mock_spam, spam)
+
+ # Verify
+ self.assertEquals('mock bar', actual_foo_bar)
+ self.assertEquals('called mock', actual_spam)
+ except ImportError:
+ print >>sys.stderr, "testStubOutClass_ABCMeta. ... Skipped - no abc module"
+
def testStubOutClass_NotAClass(self):
self.assertRaises(TypeError, self.mox.StubOutClassWithMocks,
mox_test_helper, 'MyTestFunction')
diff --git a/mox_test_helper.py b/mox_test_helper.py
index 5ac989f..58c099e 100755
--- a/mox_test_helper.py
+++ b/mox_test_helper.py
@@ -118,6 +118,25 @@ class CallableClass(object):
return 'Not mock'
+try:
+ import abc
+
+ class MyDictABC(object):
+ __metaclass__ = abc.ABCMeta
+
+ MyDictABC.register(dict)
+
+ class CallableSubclassOfMyDictABC(MyDictABC):
+
+ def __call__(self, one):
+ return 'Not mock'
+
+ def __getitem__(self, key, default=None):
+ return 'Not mock'
+except ImportError:
+ pass # Python 2.5 or earlier
+
+
def MyTestFunction(one, two, nine=None):
pass