Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模块级代码在修补时运行两次_Python_Mocking_Python Mock_Patch - Fatal编程技术网

Python 模块级代码在修补时运行两次

Python 模块级代码在修补时运行两次,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

考虑以下简单代码:

测试代码.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()
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()