2014-10-12 42 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()