当前位置: 首页 > 知识库问答 >
问题:

谁在“不要嘲笑第三方”和“确保接近()呼叫”之间的战斗中获胜?

赫连棋
2023-03-14

我有这个代码块,我想单元测试:

@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()是一个帮助函数,它在类上修补\uuu init__()方法,在本例中:

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来确保off()被调用?

共有1个答案

穆鸿卓
2023-03-14

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

我使用代理而不是mock是有原因的。您没有替换它(像mock对象通常做的那样)。您只是添加了一个透明层。

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

 类似资料:
  • 是否有一种方法可以获得从来电连接到运营商到使用Twilio应答之间的时间? null 有办法得到#5和#9之间的时间增量吗?

  • 运行jUnit时的异常 我想测试这个类,下面是测试方法 运行junit会产生以下异常

  • 我也是Mockito和PowerMockito的新手。我发现我无法使用纯Mockito测试静态方法,因此我需要使用PowerMockito(对吗?)。 我有一个非常简单的类,名为Validate,使用这个非常简单的方法 因此,我需要验证: 1) 当我在null message参数上调用该静态方法时,将调用IllegalArgumentException。2)当我在null object参数上调用该

  • 我目前正在做一个小项目,作为Java测试课程的实习,我们试图看看mocking是如何工作的。 我们的目标是看到我们可以忽略我们所嘲笑的类中的错误。 正如您在Collaborateur中看到的,缺少一个“;”在System.Out之后,exercice的目标是表明嘲笑这个类可以让我们忽略这个错误。我的一些同事使用Eclipse时,使用“以JUnit形式运行”功能没有问题。 在Intellij中,我没

  • 我试图在中模拟axios和。到目前为止,这是我的代码: 据我所知,这和文件里的一模一样 确切的例子: 并且我得到了 我错过了什么?

  • 以下是日志供参考: IllegalStateException:无法转换名为com.xyz.TestLoad的类。原因:java.io.ioException:无效常量类型:在org.powermock.core.classloader.mockClassLoader.loadModifiedClass(MockClassLoader.java:180)在org.powermock.core.cl