测试在tarfile.open上下文管理器内部调用的函数?

问题描述 投票:0回答:1

我编写了一个创建压缩包的函数。

# tarball.py
import os
import tarfile


def create_tarball():
    with tarfile.open("path/to/tar/file", "w:gz") as tar:
        tar.add(
            "/path/to/included/directory",
            arcname=os.path.basename("/path/to/included/directory"),
        )

我在tarfile.open上下文管理器上写了一个带有断言的通过测试。

from unittest.mock import patch

from tarball import create_tarball


@patch("tarball.tarfile.open")
def test_create_tarball_partial(mock_open):
    create_tarball()

    mock_open.assert_called_with("path/to/tar/file", "w:gz")

我如何为在tarfile.open上下文管理器内部调用的函数编写测试?

python unit-testing pytest tar
1个回答
0
投票

要为tar.add功能编写测试,请执行以下操作。

  1. 修补os.path.basename功能
  2. 使用tar.add创建MagicMock的模拟
  3. 将上下文管理器中的tar.add函数的值设置为MagicMock¹
  4. 设置os.path.basename功能的返回值
  5. 关于模拟的os.path.basenametarfile.open函数的声明

例如:

from unittest.mock import patch, MagicMock

from tarball import create_tarball


@patch("tarball.os.path.basename")
@patch("tarball.tarfile.open")
def test_create_tarball_full(mock_open, mock_basename):
    mock_add = MagicMock()
    mock_open.return_value.__enter__.return_value.add = mock_add
    mock_basename.return_value = "/path/to/included/directory"

    create_tarball()

    mock_open.assert_called_with("path/to/tar/file", "w:gz")
    mock_basename.assert_called_with("/path/to/included/directory")
    mock_add.assert_called_with(
        "/path/to/included/directory", arcname="/path/to/included/directory"
    )

¹Python: Mocking a context manager

© www.soinside.com 2019 - 2024. All rights reserved.