2014-08-27 72 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