Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谁能在这场战争中获胜;don';“模拟第三方”;及;确保close()被调用为";?_Python_Unit Testing_Mocking - Fatal编程技术网

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库中,有一个“”的概念,它与您提到的代理模拟的概念相同。我以前在阅读文档时见过它,但从未尝试过,也没有想到过它,直到您提到。我相信这会很好地完成这项任务,而且可以在一次测试中全部完成:)谢谢@斯坎尼很高兴按了门铃。:-)