gpt4 book ai didi

python - 如何根据传递给 open() 的参数以不同方式模拟打开

转载 作者:行者123 更新时间:2023-12-01 22:26:01 26 4
gpt4 key购买 nike

我的问题是如何在 python 中模拟打开,以便它根据调用 open() 的参数做出不同的 react 。这些是一些应该可能的不同场景:

  • 打开模拟文件;阅读预设内容,基本场景。
  • 打开两个模拟文件并让它们为 read() 方法返回不同的值。打开/读取文件的顺序不应影响结果。
  • 此外,如果我调用 open('actual_file.txt') 打开一个实际文件,我希望打开实际文件,而不是具有模拟行为的魔术模拟。或者,如果我只是不想模拟访问某个文件,但我确实希望模拟其他文件,这应该是可能的。

我知道这个问题:Python mock builtin 'open' in a class using two different files .但是这个答案只能部分回答第二个要求。关于顺序独立结果的部分不包括在内,它没有指定如何只模拟一些调用,并允许其他调用通过实际文件(默认行为)。

最佳答案

有点晚了,但我最近遇到了同样的需求,所以我想分享我的解决方案,基于 this answer来自 the referred-to question :

import pytest
from unittest.mock import mock_open
from functools import partial
from pathlib import Path


mock_file_data = {
"file1.txt": "some text 1",
"file2.txt": "some text 2",
# ... and so on ...
}


do_not_mock: {
# If you need exact match (see note in mocked_file(),
# you should replace these with the correct Path() invocations
"notmocked1.txt",
"notmocked2.txt",
# ... and so on ...
}


# Ref: https://stackoverflow.com/a/38618056/149900
def mocked_file(m, fn, *args, **kwargs):
m.opened_file = Path(fn)
fn = Path(fn).name # If you need exact path match, remove this line
if fn in do_not_mock:
return open(fn, *args, **kwargs)
if fn not in mock_file_data:
raise FileNotFoundError
data = mock_file_data[fn]
file_obj = mock_open(read_data=data).return_value
file_obj.__iter__.return_value = data.splitlines(True)
return file_obj


def assert_opened(m, fn):
fn = Path(fn)
assert m.opened_file == fn


@pytest.fixture()
def mocked_open(mocker):
m = mocker.patch("builtins.open")
m.side_effect = partial(mocked_file, m)
m.assert_opened = partial(assert_opened, m)
return m


def test_something(mocked_open):
...
# Something that should NOT invoke open()
mocked_open.assert_not_called()

...
# Something that SHOULD invoke open()
mocked_open.assert_called_once()
mocked_open.assert_opened("file1.txt")
# Depends on how the tested unit handle "naked" filenames,
# you might have to change the arg to:
# Path.cwd() / "file1.txt"

# ... and so on ...

请注意 (1) 我正在使用 Python 3,并且 (2) 我正在使用 pytest

关于python - 如何根据传递给 open() 的参数以不同方式模拟打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34423564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com