2016-07-19 40 views
3

我试图模仿文件开开,所有的例子表明,我需要模拟文件在python

@patch('open', create=True) 

,但我不断收到

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

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

+1

1.你发布的内容,我们不能告诉你路径应该是什么,或者如果这是问题。给一个[mcve]。 2.你知道这里有['mock_open'](https://docs.python.org/3/library/unittest.mock.html#mock-open)吗? – jonrsharpe

回答

9

您需要包含模块名称;如果你是在一个测试脚本,该模块的名称为__main__

@patch('__main__.open') 

以其他方式使用含有要测试的代码模块的名称:

@patch('module_under_test.open') 

使任何代码使用内置的open()反而会找到打补丁的全局。

注意,mock模块配备了一个mock_open() utility那会让你建立一个适合open()调用与文件数据:

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n')) 
+0

进一步的问题:可以使用这种模拟(具有指定的return_value)作为上下文管理器(在'with'语句中)? – 0xc0de

+0

@ 0xc0de:是的,我链接到的文档包含'open()'与'with'语句一起使用的示例,并且正在使用'mock_open()'修补。 –

+0

是的,我在稍后询问后才看到它。谢谢。 – 0xc0de

1

在Python 3,你应该使用:

@mock.patch("builtins.open", create=True)