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
在找不到属性时创建该属性,在这种情况下非常有用:
这对于针对您的属性编写测试非常有用
生产代码在运行时创建