谁在“不要嘲笑第三方”和“确保close()调用”之间的战斗中获胜?

2024-10-05 14:24:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码要进行单元测试:

@staticmethod
def _read_from_zip(pkg_zip_path):
    """
    Return a |BlobCollection| instance loaded from *pkg_zip_path*.
    """
    blobs = BlobCollection()
    zipf = ZipFile(pkg_zip_path)
    for name in zipf.namelist():
        blobs[name] = zipf.read(name)
    zipf.close()
    root_uri = os.path.splitext(pkg_zip_path)[0]
    return PhysPkg(blobs, root_uri)

它调用ZipFile,一个库/第三方包,所以我想写一个与ZipFile集成的测试,而不是模仿它(不要模仿第三方代码规则)。在

这是我目前为止的测试。initializer_mock()是一个helper函数,用于修补类上的__init__()方法,在本例中是PhysPkg

^{pr2}$

问题是,因为我没有模仿ZipFile,所以我不知道如何测试调用close()方法。在

也许我应该写两个测试?这一个是通过测试结果来确保与ZipFile的正确集成,另一个是模拟ZipFile以确保调用close()?在


Tags: path代码namefromclosereadpkgroot
1条回答
网友
1楼 · 发布于 2024-10-05 14:24:36

是的,你应该写两个测试。或者,您可以创建一个指向库的代理,该代理转发每个方法,但计算调用close的次数。在

我用proxy代替mock是有原因的。您并没有替换它(就像模拟对象通常所做的那样)。你只是在添加一个透明层。在

你“不模仿第三方库”的原因是你需要测试它们(尤其是当你更新它们或者想要更新它们的时候)。一种选择是信任提供者。另一个是创建一个完整的测试。第三种方法(是的,是的,是由“不要模仿第三方库”提出的)是只在软件有效使用它们的那些方面测试它们。一个proxy mock不会改变这一点。在

相关问题 更多 >