Python 模块级代码在修补时运行两次
考虑以下简单代码: 测试代码.pyPython 模块级代码在修补时运行两次,python,mocking,python-mock,patch,Python,Mocking,Python Mock,Patch,考虑以下简单代码: 测试代码.py def f(): return 'unpatched' import patch_stuff patch_stuff.patch_it_up() print f() from mock import patch def patch_it_up(): p = patch('test_code.f') m = p.start() m.return_value = 'patched' from mock import pat
def f():
return 'unpatched'
import patch_stuff
patch_stuff.patch_it_up()
print f()
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
return m
def f():
return 'unpatched'
import patch_stuff
if __name__ == "__main__":
m = patch_stuff.patch_it_up()
print m()
patch\u stuff.py
def f():
return 'unpatched'
import patch_stuff
patch_stuff.patch_it_up()
print f()
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
return m
def f():
return 'unpatched'
import patch_stuff
if __name__ == "__main__":
m = patch_stuff.patch_it_up()
print m()
我希望运行python test\u code.py
的输出是
patched
然而,结果是:
unpatched
patched
怎么回事?代码中有两个问题。首先,test_code.py文件被调用两次-首先调用它,然后在
mock
导入它以创建修补程序时再次调用。因此,您应该按如下方式进行更改:
def f():
return 'unpatched'
import patch_stuff
if __name__ == "__main__":
patch_stuff.patch_it_up()
print f()
这将只打印'unpatched'
字符串。这导致了第二件事:这表明修补程序不是这样工作的。调用start
方法时,它返回要使用的修补对象。因此,通过以下修改可以实现预期输出:
patch\u stuff.py
def f():
return 'unpatched'
import patch_stuff
patch_stuff.patch_it_up()
print f()
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
return m
def f():
return 'unpatched'
import patch_stuff
if __name__ == "__main__":
m = patch_stuff.patch_it_up()
print m()
测试代码.py
def f():
return 'unpatched'
import patch_stuff
patch_stuff.patch_it_up()
print f()
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
from mock import patch
def patch_it_up():
p = patch('test_code.f')
m = p.start()
m.return_value = 'patched'
return m
def f():
return 'unpatched'
import patch_stuff
if __name__ == "__main__":
m = patch_stuff.patch_it_up()
print m()
这将打印预期的“修补的”
字符串
这使得该场景不太实用,但文档中的所有示例仅显示了修改在当前上下文中导入的模块的可能性。例如,这也将起作用:
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()