2014-08-27 47 views
0

我需要模擬一個函數和所有指向這個函數的引用。模擬功能,以及對這個功能的引用

例子:

import mock 

def do(msg): 
    print(msg) 

def foo(): 
    do('foo') 

bar=foo 

with mock.patch(__name__ + '.foo', lambda *args: do('mocked')): 
    foo() 
    bar() 

輸出爲:

mocked 
foo 

但在我來說,我需要模擬真實的功能,而不只是它的名稱指向函數的實現。

背景:我想修補https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PROTECT

我怎樣才能得到所需的輸出,而不使用「欄」。

mocked 
mocked 
+0

你不能; 'mock'只是提供暫時覆蓋名稱所指的機制。你必須分別嘲笑每個名字。 – chepner 2014-08-27 13:35:02

回答

0

而不是嘲笑foo,你可以簡單地嘲笑do代替。

with mock.patch(__name__ + '.do', lambda *args: print("mocked")): 
    foo() 
    bar() 
+0

對不起,我只需要'do()',因爲'print()'在lambda()中不起作用。 – guettli 2014-08-27 13:54:21

+0

您使用的是什麼版本的Python?你可以使用'from __future__ import print_function'在Python 2.7中創建'print'函數(就像在Python 3.x中一樣)。哦,我知道,'foo'有不同的身體。在這種情況下,你可能會也可能不會輕易地模擬'foo'裏面的內容,而不是模擬'foo'本身。 – chepner 2014-08-27 13:56:09