使用上下文管理器模拟open并获取open参数

2024-06-12 05:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,很抱歉,如果这之前有人回答,但我已经到处寻找,没有找到任何东西。在

我有一个函数可以执行此操作(总而言之):

def func(path):
  with open(path) as f:
    json.load(f)

我想对它进行单元测试,我希望在使用open作为上下文管理器时,f是我传递给open的参数的名称。我遇到的问题是我不能在适当的模块中模拟enter方法,它每次都会出错。这就是我目前所做的:

^{pr2}$

MagicMock数字1执行我期望它做的事情,当我运行open(“test”)时,它返回“test”。尽管如此,我不能通过mockenter来返回传递给open的任何内容,它总是以AttributeError: __enter__失败。我也试过

builtins.open.return_value.__enter__ = MagicMock...

运气不好。有人能想出一个办法来实现这一点吗?我已经看到了如何模仿魔术方法,我认为我对unittest模拟很满意,但在这种情况下,我找不到合适的解决方案。谢谢!在


Tags: path方法函数testjson管理器defas
1条回答
网友
1楼 · 发布于 2024-06-12 05:31:36

我明白了!在

我不得不在日常生活中定义副作用,但似乎工作得很好。我就是这么做的:

def setUp(self):
    # Setup the content of the config files for the tests
    json.load = MagicMock(side_effect=file_content)

    # Opening a file returns the name of the file
    def get_mock_context(filename):
        mock_context = MagicMock()
        mock_context.__enter__.return_value = filename
        mock_context.__exit__.return_value = False
        return mock_context
    builtins.open = MagicMock(side_effect=get_mock_context)

这样,返回的值就是一个mock,它有__enter__和{}方法,返回的文件名正好是我传递给open调用的文件名。在

相关问题 更多 >