我有一段代码要进行单元测试:
@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
:
问题是,因为我没有模仿ZipFile,所以我不知道如何测试调用close()
方法。在
也许我应该写两个测试?这一个是通过测试结果来确保与ZipFile的正确集成,另一个是模拟ZipFile以确保调用close()
?在
是的,你应该写两个测试。或者,您可以创建一个指向库的代理,该代理转发每个方法,但计算调用
close
的次数。在我用
proxy
代替mock
是有原因的。您并没有替换它(就像模拟对象通常所做的那样)。你只是在添加一个透明层。在你“不模仿第三方库”的原因是你需要测试它们(尤其是当你更新它们或者想要更新它们的时候)。一种选择是信任提供者。另一个是创建一个完整的测试。第三种方法(是的,是的,是由“不要模仿第三方库”提出的)是只在软件有效使用它们的那些方面测试它们。一个
proxy mock
不会改变这一点。在相关问题 更多 >
编程相关推荐