gpt4 book ai didi

python-3.x - 如何在 pytest 中模拟 subprocess.run?

转载 作者:行者123 更新时间:2023-12-04 16:45:05 25 4
gpt4 key购买 nike

我定义了这个类:

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?我还想断言是否引发了异常?

最佳答案

似乎你需要两个测试来测试这个方法,一个返回数据,一个引发 Exception .
对于我们返回数据的那个,我们只需要模拟 subprocess.run .然后我们可以创建另一个 Mock模拟对象 stdout.decode返回 json.loads 的数据可以解析。这意味着创建一个 Mock stdout 行为的对象然后配置我们模拟的 subprocess.run使用这个对象。
对于其他测试,我们只需要使用 side_effect kwarg of the Mock对象在调用时引发异常。
鉴于以下文件夹结构:

stackoverflow/
├── mypackage
│   ├── __init__.py
│   └── proc.py
└── tests
├── __init__.py
└── test_proc.py
我们编写的测试如下所示。
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最近几天的问题是花一些时间阅读两者的文档。制作一些玩具示例并使用这两个包。这是您将学习如何模拟以及在哪里进行模拟的唯一方法。

关于python-3.x - 如何在 pytest 中模拟 subprocess.run?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66332005/

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