Python 使用mock从导入的文件修补导入的open

Python 使用mock从导入的文件修补导入的open,python,mocking,Python,Mocking,我有两个文件: #file1.py def_writefile(): ... fp = open('file') fp.write('blah') ... #file2.py file1.writefile() 我尝试过用不同的方法修补: #test_file.py fn = mock.mock_open() with mock.patch('__builtin__.open', fn): file1.writefile() with mock.p

我有两个文件:

#file1.py
def_writefile():
    ...
    fp = open('file')
    fp.write('blah')
    ...


#file2.py
file1.writefile()
我尝试过用不同的方法修补:

#test_file.py
fn = mock.mock_open()
with mock.patch('__builtin__.open', fn):
    file1.writefile()

with mock.patch('file1.open', fn):
    file1.writefile()

with mock.patch('file2.open', fn):
    file1.writefile()

with mock.patch('__main__.open', fn, create=True):
    file1.writefile()

assert(mock_file().write.called_once_with('blah'))
但它们似乎都不起作用。使用mock从导入的模块修补类似内置的open的正确方法是什么?

您想要:

import file1

fn = mock.mock_open()
with mock.patch('file1.open', fn, create=True):
    file1.writefile()

fn().write.assert_called_once_with('blah')
您需要模拟将在
file1.py
中使用的
open
函数,因此我们将
'file1.open'
传递给
“\uu main\uuuuuu.open”
。您缺少的另一点是,您没有使用正确的函数来确保使用正确的参数调用
write
——您需要使用
Mock
类中内置的函数

create=True
是必需的,因为导入时在
file1
类中找不到
open
函数,因为
open
函数直到运行时才真正拉入模块。通常这意味着
mock
将抛出一个异常,说明
file1
缺少该属性。添加
create=True
会使
mock
在找不到属性时创建该属性,在这种情况下非常有用:

这对于针对您的属性编写测试非常有用 生产代码在运行时创建