似乎kwarg赋值没有在mock.patch中被模拟,但如果在函数内部调用它,它就是。
有什么想法吗?
import platform
import mock
def test(arch=platform.machine()):
print "arch = %s" % arch
print "machine = %s" % platform.machine()
with mock.patch.object(platform, "machine", return_value="TEST"):
test()
# This outputs
# arch = x86_64
# machine = TEST
答案 0 :(得分:1)
在执行函数定义时,函数默认值与函数对象一起设置和存储。
模拟platform.machine
工作正常,但arch
参数的默认值早已通过调用platform.machine()
并使用返回值设置。 <{1}}被调用时,表达式 not 。
请参阅"Least Astonishment" in Python: The Mutable Default Argument了解原因。
在导入定义函数的模块之前,您需要修补test()
;您可以将该功能移动到新模块,并执行以下操作:
platform
这很麻烦,如果要在线程中运行测试,则会失败。
您可以使用import sys
if 'modulename' in sys.modules:
del sys.modules['modulename'] # ensure the cached module is cleared
with mock.patch.object(platform, "machine", return_value="TEST"):
from modulename import sys
test()
del sys.modules['modulename'] # clear the module with the mocked value again
代替默认值,并在调用None
时创建默认值:
test