2014-10-12 49 views
1

时请考虑以下简单的代码:模块级的代码运行两次修补

test_code.py

def f(): 
    return 'unpatched' 

import patch_stuff 

patch_stuff.patch_it_up() 
print f() 

patch_stuff.py

from mock import patch 

def patch_it_up(): 
    p = patch('test_code.f') 
    m = p.start() 
    m.return_value = 'patched' 

我期望的输出运行python test_code.py

patched 

但是输出是:

unpatched 
patched 

怎么来的?

回答

1

你的代码有两个问题。首先,test_code.py文件被调用两次 - 当您调用它时首先调用它,然后在mock导入它时再次调用该文件以创建一个修补程序。所以,你应该如下更改:

def f(): 
    return 'unpatched' 

import patch_stuff 

if __name__ == "__main__": 
    patch_stuff.patch_it_up() 
    print f() 

这将只打印'unpatched'字符串。导致第二件事:the documentation暗示这不是修补程序的工作方式。当您调用start方法时,它将返回要使用的修补对象。因此,预计输出可与以下修改来实现:

patch_stuff.py

from mock import patch 

def patch_it_up(): 
    p = patch('test_code.f') 
    m = p.start() 
    m.return_value = 'patched' 
    return m 

test_code.py

def f(): 
    return 'unpatched' 

import patch_stuff 

if __name__ == "__main__": 
    m = patch_stuff.patch_it_up() 
    print m() 

这将打印预期'patched'字符串。


这使得这个场景不太实际,但文档中的所有示例仅显示修改当前上下文中导入的模块的可能性。例如,这也将起作用:

from mock import patch 

def patch_it_up(): 
    import test_code 
    p = patch('test_code.f') 
    m = p.start() 
    m.return_value = 'patched' 
    print "inside patch_it_up:", test_code.f()