mock不适用于kwargs上的对象

时间:2015-05-08 16:24:53

标签: python mocking

似乎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

1 个答案:

答案 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