首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在pytest中模拟subprocess.run?

如何在pytest中模拟subprocess.run?
EN

Stack Overflow用户
提问于 2021-02-23 19:11:23
回答 1查看 1.8K关注 0票数 2

我定义了这个类:

代码语言:javascript
运行
复制
class InternalProc:

    @staticmethod
    def get_data():
        try:
            result = subprocess.run(['bridge-client', '--business-credentials'],
                                    stdout=subprocess.PIPE)
            data = json.loads(result.stdout.decode('utf-8'))
            return data
        except Exception:
            logger.error("Unable to fetch the data")
            raise

我想对get_data()进行单元测试,我应该如何模拟subprocess.run?我还想断言异常是否被引发?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-23 20:47:51

似乎需要两个测试来测试这个方法,一个返回数据,另一个引发Exception

对于返回数据的示例,我们只需模拟subprocess.run。然后我们可以创建另一个Mock对象来模拟stdout.decode,以返回json.loads可以解析的数据。这意味着为stdout的行为创建一个Mock对象,然后配置我们模拟的subprocess.run来使用这个对象。

对于另一个测试,我们只需要使用Mock对象的side_effect kwarg在它被调用时引发一个异常。

给定以下文件夹结构:

代码语言:javascript
运行
复制
stackoverflow/
├── mypackage
│   ├── __init__.py
│   └── proc.py
└── tests
    ├── __init__.py
    └── test_proc.py

我们编写的测试如下所示。

代码语言:javascript
运行
复制
from unittest.mock import MagicMock, patch

import pytest

from mypackage.proc import InternalProc


@patch("mypackage.proc.subprocess.run")
def test_get_data_valid(mock_run):
    mock_stdout = MagicMock()
    mock_stdout.configure_mock(
        **{
            "stdout.decode.return_value": '{"A": 3}'
        }
    )

    mock_run.return_value = mock_stdout

    result = InternalProc.get_data()
    assert result == {"A": 3}


@patch("mypackage.proc.subprocess.run", side_effect=Exception("foobar"))
def test_get_data_invalid(mock_run):
    with pytest.raises(Exception) as exc:
        InternalProc.get_data()
        assert "foobar" in str(exc.value)

======================================= test session starts ========================================
platform darwin -- Python 3.9.1, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: ***/stackoverflow
collected 2 items                                                                                  

tests/test_proc.py ..                                                                        [100%]

======================================== 2 passed in 0.07s =========================================

我建议您,因为我在过去几天中看到您发布了多个pytest/mock问题,所以我建议您花一些时间阅读这两个问题的文档。制作一些玩具示例,并使用这两个包。这是您学习如何模拟以及在哪里模拟的唯一方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66332005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档