2011-08-15 58 views
1

我是Python新手(我來自Java),我在使用Python3.2中的mocks時遇到了一個問題。如何在Python3中用構造函數模擬對象?

下面是代碼:

import gzip  

class MyClass: 

    _content = None 

    _gzipfile = gzip.GzipFile 

    def __init__(self, content): 
     self._content = content 

    def my_method(self): 
     # Code ... 
     gzipper = self._gzipfile(fileobj=data) 
     return gzipper.read() 


import unittest 
from mockito import * 

class MyClassTest(unittest.TestCase): 

    def my_method_test(self): 
     gzipfile = mock 
     myclass = MyClass() 
     myclass._gzipfile = mock 
     myclass.my_method 

我想單元測試我的方法(我使用嘲笑LIB的Mockito)。但是當我執行測試時,我收到了:

TypeError: __init__() got an unexpected keyword argument 'fileobj' 

在這種情況下,我不得不使用命名參數調用GzipFile對象。

有沒有一種很好的方式來模擬這個GzipFile對象(和類似的)?

+2

'__init'是一個錯字還是一個實際的錯誤? – Arafangion

+0

這不是一個錯字,雙下劃線使斜體文本,我不知道如何逃避它們...所以我騙了 – Guillaume

+0

啊,那麼,在這種情況下,我建議添加一個預計'fileobj'參數的初始化程序。 – Arafangion

回答

0

您看到的TypeError是由於您將myclass._gzipfile分配給mockito.mock類對象而造成的。所以當my_method調用_gzipfile與關鍵字參數fileobj=data,它實際上是調用mockito.mock類,從而調用其不知道這個參數的方法__init__

這樣的事情應該工作。它仍然不是一個理想的單元測試,因爲它依賴於gzip.GzipFile,但它應該有助於開始。

import gzip 

class MyClass(object): 
    def __init__(self, content, file): 
     self._content = content 
     self._gzipper = gzip.GzipFile(filename=file) 
    def my_method(self): 
     # Code ... 
     return self._gzipper.read() 

import unittest 
from mockito import * 

class TestMyClass(unittest.TestCase): 
    def setUp(self): 
     self.my_class = MyClass('some content', 'file') 

    def test_my_method(self): 
    self.my_class._gzipper = mock() 
     when(self.my_class._gzipper).read().thenReturn('gzipper read return') 
     data = self.my_class.my_method() 
     self.assertEqual(data, 'gzipper read return') 

if __name__ == '__main__': 
    unittest.main() 
相關問題