與this question你真正想做的是patch您的MyClass
實例。如果MyClass
是new-style class,那麼你可以這樣做:
class Test_mytest(MockerTestCase):
def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
methodToMock = getattr(self.p, function)
methodToMock()
self.m.result(result)
self.m.count(mmin, mmax)
def setUp(self):
self.m = Mocker()
self.o = MyClass(0)
self.p = self.m.patch(self.o)
self.mock_it_up('toBeMockedMethod')
# Put more calls to mock_it_up here.
self.m.replay()
def test_one_atom(self):
self.o.mymethod()
這將修改self.o
因此調用toBeMockedMethod
被嘲笑。
但是,如果MyClass
不是新風格類,則修補程序將不起作用。在這種情況下,您可以使用type simulation來欺騙MyClass
做你想做的事。例如:
class Test_mytest(MockerTestCase):
def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
methodToMock = getattr(self.mockObj, function)
methodToMock()
self.m.result(result)
self.m.count(mmin, mmax)
def setUp(self):
self.m = Mocker()
self.o = MyClass(0)
self.mockObj = self.m.mock(MyClass)
self.mock_it_up('toBeMockedMethod')
# Put more calls to mock_it_up here.
self.m.replay()
def test_one_atom(self):
MyClass.mymethod(self.mockObj)
注意,模仿者的mock
方法被調用的類是類型模擬。之後,我們不打電話self.o.mymethod()
,而是撥打MyClass.mymethod(...)
。現在MyClass.mymethod()
需要一個MyClass
的實例作爲它的第一個參數,但幸運的是這個模擬對象僞裝成MyClass
的一個實例,所以這個調用通過。當mymethod()
調用toBeMockedMethod()
它實際上會調用模擬方法,而不是真正的方法。
我迅速入侵了一個測試MyClass
這樣的:
class MyClass():
def __init__(self, x):
self.x = x
def toBeMockedMethod(self):
print "Not Mocked!"
def mymethod(self):
self.toBeMockedMethod()
和當我跑將該代碼作爲一個單元測試我得到:
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
這是期望的結果。
我正在嘗試你的示例,當我調用m.replay()時,「無法設置內置/擴展類型實例的屬性」() – ApriOri
@ApriOri當我測試它時代碼爲我工作回到2011年12月。您可能想問一個關於StackOverflow的問題,列出您的代碼並尋求幫助。 – srgerg