18

我正在尝试模拟打开文件,所有示例都表明我需要

@patch('open', create=True) 

但我不断得到

Need a valid target to patch. You supplied: 'open'

我知道补丁需要完整的虚线路径open,但我不知道它是什么。事实上,我什至不确定这是否是问题所在。

4

2 回答 2

27

您需要包含一个模块名称;如果您在脚本中进行测试,则模块的名称为__main__

@patch('__main__.open')

否则使用包含您正在测试的代码的模块的名称:

@patch('module_under_test.open')

这样任何使用open()内置的代码都会找到修补的全局代码。

请注意,该mock模块带有一个mock_open()实用程序,可让您open()使用文件数据构建合适的调用:

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n'))
于 2016-07-19T09:24:38.163 回答
23

在 Python 3 中,您应该使用:

@mock.patch("builtins.open", create=True)
于 2017-06-21T13:33:54.977 回答