Python 谁能在这场战争中获胜;don';“模拟第三方”;及;确保close()被调用为";?
我有一段代码要进行单元测试:Python 谁能在这场战争中获胜;don';“模拟第三方”;及;确保close()被调用为";?,python,unit-testing,mocking,Python,Unit Testing,Mocking,我有一段代码要进行单元测试: @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(): b
@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\u mock()
是一个辅助函数,用于在类上修补\uuu init\uuu()
方法,在这种情况下,PhysPkg:
from opcdiag.phys_pkg import PhysPkg
MINI_PKG_PATH = 'test_files/mini_pkg.zip'
@pytest.fixture
def init(self, request):
return initializer_mock(PhysPkg, request)
def it_can_construct_from_a_zip_package(self, init):
PhysPkg._read_from_zip(MINI_PKG_PATH)
expected_blobs = {'uri_1': b'blob_1\n', 'uri_2': b'blob_2\n'}
init.assert_called_once_with(expected_blobs, ROOT_URI)
问题是,因为我没有模拟ZipFile,所以我不知道如何测试调用close()
方法
也许我应该写两个测试?这一个用于通过测试结果确保与ZipFile正确集成,另一个用于模拟ZipFile以确保调用
close()
?是的,您应该编写两个测试。或者,您可以为库创建一个代理,转发每个方法,但计算调用close
的次数
出于某种原因,我使用了proxy
这个词而不是mock
。您不会替换它(模拟对象通常会这样做)。您只是添加了一个透明层
您“不模拟第三方库”的原因是您需要测试它们(尤其是当您更新它们或可能想要更新它们时)。另一种选择是信任提供者。另一个是创建一个完整的测试。第三种方法(是的,由“不要模仿第三方库”推广的方法)是只在软件有效使用它们的方面对它们进行测试。
代理模拟
不会改变这一点。噢,太棒了!我现在意识到我需要做什么。在pythonmock库中,有一个“”的概念,它与您提到的代理模拟的概念相同。我以前在阅读文档时见过它,但从未尝试过,也没有想到过它,直到您提到。我相信这会很好地完成这项任务,而且可以在一次测试中全部完成:)谢谢@斯坎尼很高兴按了门铃。:-)