【问题标题】:Mocking zipfile in python在python中模拟zipfile
【发布时间】:2015-07-14 16:24:51
【问题描述】:

我正在尝试使用 Python 模拟库来模拟 zipfile 模块的一些方法。

我要测试的示例源:

def zipStuff(listOfPathToFiles):
    with ZipFile(fName, 'w') as archive:
        for each in listOfPathToFiles:
             archive.write(each, strippedfName)
    return archive

上面的“存档”在正常执行时将被忽略,但在测试期间将是文件列表。

示例单元测试代码:

emptyList=[]

def mockWrite(fName):
    emptyList.append(fName)
    return

mockZip.__enter__ = Mock(return_value=emptyList)
mockZip.__exit__ = Mock(return_value=True)

现在,我想模拟 archive.write 以便代替实际的 write 调用,而是用 mockWrite 函数替换它,这样我就可以获得应该压缩的所有文件的列表。

我试过了:

mockZip.write = Mock(side_effect=mockWrite)

但这并没有被调用。调试显示该函数正在调用 mockZip.enter().write。如果我尝试:

mockZip.__enter__().write = Mock(side_effect=mockWrite)

Python 发出“列表”没有属性写入的错误(这是正确的)。我是 Mock 和 Python 的新手,非常感谢任何指针。有什么建议吗?

【问题讨论】:

  • mockZip.__enter__ = (return_value=emptyList) 语法无效
  • 我在这里写了代码,又错过了模拟电话。正确的语法是 Mock(return_value=emptyList)。修改了原来的问题。谢谢:)

标签: python unit-testing python-mock


【解决方案1】:

与其让mockZip.__enter__ 返回一个空列表,不如让它返回一个如下所示的对象:

class MockZipFile:
    def __init__(self):
        self.files = []
    def __iter__(self):
        return iter(self.files)
    def write(self, fname):
        self.files.append(fname)

您可以根据需要添加方法和实现以满足您的模拟需求。

【讨论】:

  • 谢谢!我现在正在使用它!
【解决方案2】:

我相信您的问题是使用 contextlib (https://docs.python.org/2/library/contextlib.html) 而不是 entry 调用该函数。更改此模拟应该可以解决您的问题。

【讨论】:

  • 对不起,我的意思是写 enter 而不是 entry。我已经编辑了帖子以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多