python 中的模拟 zip 文件
Mocking zipfile in python
我正在尝试使用 Python 模拟库来模拟 zipfile 模块的一些方法。
我要测试的示例源:
def zipStuff(listOfPathToFiles):
with ZipFile(fName, 'w') as archive:
for each in listOfPathToFiles:
archive.write(each, strippedfName)
return archive
上面的"archive"在正常执行时将被忽略,但在测试期间将是文件列表。
示例单元测试代码:
emptyList=[]
def mockWrite(fName):
emptyList.append(fName)
return
mockZip.__enter__ = Mock(return_value=emptyList)
mockZip.__exit__ = Mock(return_value=True)
现在,我想模拟 archive.write 以便用 mockWrite 函数代替实际的写入调用,这样我就可以获得应该压缩的所有文件的列表。
我试过:
mockZip.write = Mock(side_effect=mockWrite)
但这并没有被调用。调试显示该函数正在调用 mockZip.enter().write。如果我尝试:
mockZip.__enter__().write = Mock(side_effect=mockWrite)
Python 发出 'list' 没有属性写入的错误(这是正确的)。我是 Mock 和 Python 的新手,非常感谢任何指点。建议?
我认为您的问题是使用上下文库 (https://docs.python.org/2/library/contextlib.html) 而不是 entry 调用函数 enter。更改此模拟应该可以解决您的问题。
不要 mockZip.__enter__
return 一个空列表,而是 return 一个如下所示的对象:
class MockZipFile:
def __init__(self):
self.files = []
def __iter__(self):
return iter(self.files)
def write(self, fname):
self.files.append(fname)
您可以根据需要添加方法和实现以满足您的模拟需求。
我正在尝试使用 Python 模拟库来模拟 zipfile 模块的一些方法。
我要测试的示例源:
def zipStuff(listOfPathToFiles):
with ZipFile(fName, 'w') as archive:
for each in listOfPathToFiles:
archive.write(each, strippedfName)
return archive
上面的"archive"在正常执行时将被忽略,但在测试期间将是文件列表。
示例单元测试代码:
emptyList=[]
def mockWrite(fName):
emptyList.append(fName)
return
mockZip.__enter__ = Mock(return_value=emptyList)
mockZip.__exit__ = Mock(return_value=True)
现在,我想模拟 archive.write 以便用 mockWrite 函数代替实际的写入调用,这样我就可以获得应该压缩的所有文件的列表。
我试过:
mockZip.write = Mock(side_effect=mockWrite)
但这并没有被调用。调试显示该函数正在调用 mockZip.enter().write。如果我尝试:
mockZip.__enter__().write = Mock(side_effect=mockWrite)
Python 发出 'list' 没有属性写入的错误(这是正确的)。我是 Mock 和 Python 的新手,非常感谢任何指点。建议?
我认为您的问题是使用上下文库 (https://docs.python.org/2/library/contextlib.html) 而不是 entry 调用函数 enter。更改此模拟应该可以解决您的问题。
不要 mockZip.__enter__
return 一个空列表,而是 return 一个如下所示的对象:
class MockZipFile:
def __init__(self):
self.files = []
def __iter__(self):
return iter(self.files)
def write(self, fname):
self.files.append(fname)
您可以根据需要添加方法和实现以满足您的模拟需求。