2014-11-23 45 views
2

我在模塊下面的代碼:Python的模擬補丁的功能缺失的參數

class MyManager(models.Manager): 

    def dowork(self, value1, value2): 
     print value1, value2 

在模塊B:

class MyModel(models.Model): 
    objects = MyManager() 
    value1 = ...   
    value2 = ... 

    def call_manager(self): 
     self.objects.dowork(self.value1, self.value2) 

在單元測試我修補dowork與不同的機構,例如如:

def new_dowork(self, value1, value2): 
    print 123 

with patch('a.MyManager.dowork', new_callable=new_dowork): 
    record = MyModel(value=111) 
    record.call_manager() 
    ... 

但我正在逐漸TypeError: new_dowork() takes exactly 3 arguments (0 given)

+0

如果你有興趣我填補這個給你一些其他接近這一任務更加有用的方式回答。問候 – 2014-11-25 07:54:48

回答

1

我對Mock瞭解不多,但我認爲主要問題是您應該在new參數中傳遞模擬函數,而不是在new_callable中,並使用patch.object實際覆蓋對象中的方法。

這似乎工作:

from mock import patch 

class MyManager(object): 

    def dowork(self, value1, value2): 
     print value1, value2 

class MyModel(object): 
    objects = MyManager() 
    value1 = 'foo'   
    value2 = 'bar' 

    def __init__(self, value=0): 
     # You don't need this __init__... Is just so I don't have to 
     # use models.MyModel thingy 
     pass 

    def call_manager(self): 
     self.objects.dowork(self.value1, self.value2) 

def new_dowork(self, value1, value2): 
    print "Mock called" 
    print 123 

with patch.object(MyManager, 'dowork', new=new_dowork): 
    record = MyModel(value=111) 
    record.call_manager() 

此輸出:

Mock called 
123 
+0

酷,使用'新'工作,我似乎仍然不知道何時使用'new'或'new_callable' – 2014-11-24 00:28:58

+1

從文檔:_new_callable允許您指定一個不同的類或可調用的對象,將被調用創建新的對象。默認情況下使用MagicMock._因此,如果您想要替換默認的'MagicMock'「嘲笑者」類,那麼它看起來就像它被使用了,我猜測它是你很少需要的東西(它似乎試圖實例化一個類,因此,在這個特定的例子中,最終運行你的函數)但這只是一個猜測(我對Mock的瞭解還不夠多) – BorrajaX 2014-11-24 00:31:05