我试图模仿文件打开,所有的例子都显示我需要
@patch('open', create=True)
但我一直都在遇到这个问题
Need a valid target to patch. You supplied: 'open'
我知道 patch 需要 open
的完整点路径(full dotted path),但我不知道它是什么。事实上,我甚至不确定那是否是问题所在。
我试图模仿文件打开,所有的例子都显示我需要
@patch('open', create=True)
但我一直都在遇到这个问题
Need a valid target to patch. You supplied: 'open'
我知道 patch 需要 open
的完整点路径(full dotted path),但我不知道它是什么。事实上,我甚至不确定那是否是问题所在。
在Python 3中,您应该使用装饰器
@mock.patch("builtins.open", create=True)
或作为上下文管理器
with mock.patch('builtins.open', mock.mock_open(read_data=some_data)) as m:
...
您需要包含一个模块名称;如果您正在脚本中进行测试,则模块的名称为__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'))
with
语句中)使用? - 0xc0deopen()
在with
语句中使用以及使用mock_open()
进行补丁的示例。 - Martijn Pieterspatch()
可以使用模拟对象替换目标,因此首先创建模拟对象,然后使用patch()
将两个目标替换为同一个对象。或者,只需创建两个模拟对象,因为这样可能会有好处(您可以以不同的方式配置模拟对象)。 - Martijn Pieters
mock_open
吗?具体请参考 Python官方文档。