如何测试在 tarfile.open 上下文管理器中调用的函数?
How do I test a function called inside the tarfile.open context manager?
我编写了一个创建 tarball 的函数。
# 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
上下文管理器中调用的函数编写测试?
要为 tar.add
函数编写测试,请执行以下操作。
- 修补
os.path.basename
函数
- 使用 MagicMock
创建 tar.add
的模拟
- 将上下文管理器中的
tar.add
函数的值设置为 MagicMock¹
- 设置
os.path.basename
函数的return值
- 对模拟的
os.path.basename
和 tarfile.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"
)
¹
我编写了一个创建 tarball 的函数。
# 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
上下文管理器中调用的函数编写测试?
要为 tar.add
函数编写测试,请执行以下操作。
- 修补
os.path.basename
函数 - 使用 MagicMock 创建
- 将上下文管理器中的
tar.add
函数的值设置为 MagicMock¹ - 设置
os.path.basename
函数的return值 - 对模拟的
os.path.basename
和tarfile.open
函数进行断言
tar.add
的模拟
例如:
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"
)
¹