如何在pytest fixture中Mock系统功能并验证调用参数与返回值?
用pytest Mock系统级依赖测试Scene类
先看要测试的Scene类示例
假设你的Scene类实现如下(包含系统命令、目录创建、HTTP请求三个核心操作):
import os from pathlib import Path import requests class Scene: def create_directory(self, dir_path: str): Path(dir_path).mkdir(parents=True, exist_ok=True) def run_system_command(self, cmd: str): return os.system(cmd) def fetch_data(self, url: str): response = requests.get(url) response.raise_for_status() return response.json()
测试步骤
1. 安装必要依赖
先装pytest和pytest-mock(后者简化Mock操作):
pip install pytest pytest-mock
2. 编写测试用例
新建test_scene.py文件,逐个测试Scene的方法:
from scene import Scene def test_create_directory(mocker): # Mock Scene类里用到的Path.mkdir方法 mock_mkdir = mocker.patch("scene.Path.mkdir") scene = Scene() scene.create_directory("/test/path") # 验证mkdir被调用了一次,且参数完全符合预期 mock_mkdir.assert_called_once_with(parents=True, exist_ok=True) def test_run_system_command(mocker): # Mock os.system,指定它返回0(模拟命令执行成功) mock_system = mocker.patch("scene.os.system", return_value=0) scene = Scene() result = scene.run_system_command("echo hello") # 验证命令被正确传入,且返回值符合预期 mock_system.assert_called_once_with("echo hello") assert result == 0 def test_fetch_data(mocker): # 先Mock requests.get的返回对象 mock_response = mocker.Mock() mock_response.json.return_value = {"key": "value"} mock_response.raise_for_status.return_value = None # 再Mock requests.get方法,让它返回上面的Mock对象 mock_get = mocker.patch("scene.requests.get", return_value=mock_response) scene = Scene() data = scene.fetch_data("https://example.com/api") # 验证整个调用链:请求发对了URL、调用了状态检查、解析了JSON mock_get.assert_called_once_with("https://example.com/api") mock_response.raise_for_status.assert_called_once() mock_response.json.assert_called_once() # 验证返回的JSON数据正确 assert data == {"key": "value"}
关键注意点
- Mock路径要精准:必须Mock被测试代码(scene模块)里实际引用的依赖路径,比如
scene.Path而不是pathlib.Path,不然Mock不会生效。 - 链式调用的Mock技巧:像requests这种返回对象后还要调用方法的,得先Mock返回的Response对象,再给它的方法设置返回值,才能完整验证整个流程。
- 参数与返回值双验证:既要确认方法被传入了正确的参数,也要验证返回值符合业务逻辑预期,确保代码的行为完全正确。
内容的提问来源于stack exchange,提问作者nickponline
相关产品推荐
相关产品推荐

