模拟文件在python中打开

Tzu*_*rEl 6 python unit-testing mocking magicmock

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

@patch('open', create=True) 
Run Code Online (Sandbox Code Playgroud)

但我一直在

Need a valid target to patch. You supplied: 'open'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 15

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

@patch('__main__.open')
Run Code Online (Sandbox Code Playgroud)

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

@patch('module_under_test.open')
Run Code Online (Sandbox Code Playgroud)

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

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

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n'))
Run Code Online (Sandbox Code Playgroud)


wie*_*iks 10

在Python 3中你应该使用:

@mock.patch("builtins.open", create=True)
Run Code Online (Sandbox Code Playgroud)