如何在Python单元测试中模拟特定文件的存在?

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

我正在用 python 编写嵌入式软件代码的单元测试。

其中一个文件需要存在特定文件。 (例如“/dir_name/file_name.txt”)否则会引发错误。

通常,这个文件存在于硬件设备上,我的Python代码读取这个文件。在为Python代码编写单元测试时,如何模拟文件的存在?

tempfile.mkstemp()
似乎没有生成我想要的确切路径/文件名,即
/dir_name/file_name.txt
。它总是添加一些随机字母。

这是Python3.4。可以用

unittest.mock
来实现吗?

python unit-testing nose python-unittest
2个回答
2
投票

您可以创建一个上下文管理器来创建和删除文件。

from contextlib import contextmanager

@contextmanager
def mock_file(filepath, content=''):
    with open(filepath, 'w') as f:
        f.write(content)
    yield filepath
    try:
        os.remove(filepath)
    except Exception:
        pass


def test_function():
    with mock_file(r'/dirname/filename.txt'):
        function()

0
投票

这是 unittest 的“入门”页面中给出的示例之一。

对于后代,这是该页面的复制/粘贴:

DEFAULT = "default"
data_dict = {"file1": "data1",
             "file2": "data2"}

def open_side_effect(name):
    return mock_open(read_data=data_dict.get(name, DEFAULT))()

with patch("builtins.open", side_effect=open_side_effect):
    with open("file1") as file1:
        assert file1.read() == "data1"

    with open("file2") as file2:
        assert file2.read() == "data2"

    with open("file3") as file2:
        assert file2.read() == "default"
© www.soinside.com 2019 - 2024. All rights reserved.