0

0

Python mock怎么用_测试中模拟对象技巧

舞姬之光

舞姬之光

发布时间:2026-03-01 18:23:58

|

777人浏览过

|

来源于php中文网

原创

python mock怎么用_测试中模拟对象技巧

Python 的 mock 主要用于在单元测试中隔离外部依赖,比如数据库、网络请求、第三方 API 或复杂计算逻辑。核心是用可控的“假对象”替代真实对象,让测试专注验证自身逻辑,而不是被外部环境干扰。

patch 临时替换对象(最常用)

当你要模拟模块里某个函数、类或属性时,patch 是首选。它能在测试运行期间动态替换目标,测试结束自动还原,避免污染其他测试。

  • 装饰器写法(推荐,清晰易读):

  from unittest.mock import patch
  import requests

  @patch('requests.get')
  def test_fetch_data(mock_get):
    mock_get.return_value.json.return_value = {'id': 1, 'name': 'test'}
    result = fetch_user(1)
    assert result['name'] == 'test'
    mock_get.assert_called_once_with('https://api.example.com/users/1')

  • 上下文管理器写法(适合单个测试块内局部控制):

  with patch('builtins.open', mock_open(read_data='hello')) as mock_file:
    content = read_config()
    assert content == 'hello'

立即学习Python免费学习笔记(深入)”;

⚠️ 注意:patch 的路径必须是“被测试代码里导入并使用的位置”,不是定义位置。例如你在 my_module.py 中写了 import requests,然后调用 requests.get(),那就要 @patch('my_module.requests.get') —— 很多人在这里出错。

Genspark
Genspark

Genspark 是一款创新的 AI 搜索引擎,致力于提供比传统搜索引擎更高效、准确和无偏见的信息获取方式。

下载

控制返回值和行为:return_value vs side_effect

return_value 适用于固定返回;side_effect 更灵活,支持抛异常、动态返回、甚至调用真实函数。

  • return_value=42 → 每次调用都返回 42
  • return_value={'status': 'ok'} → 返回字典,可链式调用(如 mock_obj.data.name
  • side_effect=ValueError('timeout') → 调用即抛异常
  • side_effect=[1, 2, 3] → 第一次调用返回 1,第二次 2,第三次 3
  • side_effect=lambda x: x * 2 → 接收参数,返回计算结果

模拟类实例与方法调用

想测试一个类的方法是否被正确调用,或者验证它如何与依赖交互?可以 mock 整个类,再配置它的实例行为。

  from unittest.mock import patch, MagicMock

  @patch('my_module.Database')
  def test_save_user(mock_db_class):
    # mock_db_class() 返回一个 mock 实例
    mock_db = mock_db_class.return_value
    mock_db.save.return_value = True

    result = save_user_to_db({'name': 'Alice'})
    assert result is True
    mock_db.save.assert_called_once_with({'name': 'Alice'})

关键点:mock_db_class.return_value 是对“实例”的模拟,而 mock_db.save 是对“实例方法”的模拟。别混淆 return_value 的层级。

检查调用情况:断言真实发生了什么

光有返回值不够,还要确认你的代码确实按预期调用了依赖。mock 对象自带丰富的断言方法:

  • assert_called() —— 至少调用过一次
  • assert_called_once() —— 精确调用一次
  • assert_called_with(arg1, arg2) —— 最后一次调用的参数匹配
  • assert_has_calls([call(1), call(2)]) —— 检查多次调用的完整顺序
  • call_argscall_args_list —— 获取实际传入的参数(可用于调试)

例如:assert mock_send.call_args_list == [call('hi'), call('bye')] 可精准验证调用序列。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

450

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

326

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

60

2026.01.05

discuz database error怎么解决
discuz database error怎么解决

discuz database error的解决办法有:1、检查数据库配置;2、确保数据库服务器正在运行;3、检查数据库表状态;4、备份数据;5、清理缓存;6、重新安装Discuz;7、检查服务器资源;8、联系Discuz官方支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

223

2023.11.20

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号