2011-12-01 73 views
0

我想模擬MyClass.toBeMockedMethod,它在MyClass.mymethod中使用以下腳本調用。它運行時沒有真正嘲笑它。不知道爲什麼....爲什麼這個模擬腳本不起作用(unittest,Mocker,python)

class Test_mytest(MockerTestCase): 

    def mock_it_up(self, function, result=None, mmin=0, mmax=None): 
     function = self.m.mock() 
     function(ARGS) 
     self.m.result(result) 
     self.m.count(mmin, mmax) 

    def setUp(self): 
     self.m = Mocker() 

     self.mock_it_up(MyClass.toBeMockedMethod) 

     self.o=Myclass(0) 


    def test_one_atom(self): 
     self.o.mymethod() 


    def tearDown(self): 
     pass 

if __name__ == '__main__': 
    main() 

回答

0

this question你真正想做的是patch您的MyClass實例。如果MyClassnew-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 

這是期望的結果。

+0

我正在嘗試你的示例,當我調用m.replay()時,「無法設置內置/擴展類型實例的屬性」() – ApriOri

+0

@ApriOri當我測試它時代碼爲我工作回到2011年12月。您可能想問一個關於StackOverflow的問題,列出您的代碼並尋求幫助。 – srgerg