1

假设我有一个方法可以传递一些路径,读取每个路径中的文件,然后返回从文件名到文件内容的字典,如下所示:

from contextlib import ExitStack
from pathlib import Path


class ClassToTest:
    def method_to_test(self, *paths: Path):
        with ExitStack() as stack:
            files = [stack.enter_context(path.open(mode='r')) for path in paths]
            return {f.name: f.read() for f in files}

现在说我想测试如果我传入例如C:\wherever\file_name.xyz返回的字典是否包含 key file_name.xyz。由于我的测试方法是打开和读取文件,我想模拟出 Path 对象。我想我可以做类似的事情

from unittest.mock import Mock, mock_open

class Tests:
    def test(self):
        mock_path = Mock(spec=Path)
        mock_path.open = mock_open()
        # ???

        files = ClassToTest().method_to_test(mock_path)
        assert 'file_name.xyz' in files

但我不知道如何让f.name(即mock_path.open().name)返回file_name.xyz

4

1 回答 1

3

试试assert mock_path.open().name in files。应该像您使用模拟库一样工作。虽然这将是一个脆弱的测试mock_path.name != mock_path.open().name

如果您使用的是 pytest,那么只需使用tmp_path对每个测试调用都是唯一的夹具。

import pytest

def f(path):
    with path.open() as f:
        return {f.name: f.read()}

def test_f(tmp_path):
    name = 'some_file.txt'
    content = 'hello\nworld'
    path = tmp_path / name
    path.write_text(content)

    result = f(path)

    assert str(path) in result
    assert content in result.values()

def test_g(tmp_path):
    assert list(tmp_path.iterdir()) == []
于 2020-02-28T18:36:15.787 回答