示例

每次使用mock都记不住,今天也是这样,但是这里出现了不一样的地方,先举个例子:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
from mock import Mock, patchimport requests

class User(object):    def __init__(self):        """

        """

class Admin(User):    table = "admin"

    def __init__(self):        super(Admin, self).__init__()

    def list(self):        return []

# 对类进行mock@patch("__main__.Admin")def do(cls):    mock = Mock(table="Admin")    mock.list.return_value = ["A", ]    cls.return_value = mock # __init__

    a = Admin()    return a.list()

# 对方法进行mockdef send_request():    return requests.request('GET', "http://www.baidu.com/")

@patch("__main__.send_request")def do2(method):    mock = Mock(status_code=200)    mock.json.return_value = {}

    method.return_value = mock

    a = send_request()    return a.status_code, a.json()

if __name__ == '__main__':    l = do()    status_code, json = do2()    print(l)    print(status_code, json)

where to patch

上述看也没什么问题,但是此处讲一个Where to patch的问题.

简单描述:

12345678
a.py

    -> Defines SomeClass

b.py

    -> from a import SomeClass    -> some_function instantiates SomeClass

如上,a.py定义了一个SomeClass,然后b.py引入这个Class,然后在某个地方进行实例化此类,ok,如果要patch SomeClass这个类,要从a.py进行patch呢还是从b.py进行patch呢?
例如:

12345678
# b.py

from a import SomeClass

def func():    s = SomeClass()    s.do_something()
123456789101112
# test.py

class Test1(TestCase):    # 这里对?    @patch("a.SomeClass")    def do1(self,cls):        # todo    # 还是这里对?    @patch("b.SomeClass")    def do2(self,cls):        # todo

上述哪一种方法才能被正常mock??

引用外文的描述:

12345678
Now we want to test some_function but we want to mock out SomeClass using patch. The problem is that when we import module b, which we will have to do then it imports SomeClass from module a. If we use patch to mock out a.SomeClass then it will have no effect on our test; module b already has a reference to the real SomeClass and it looks like our patching had no effect.

The key is to patch out SomeClass where it is used (or where it is looked up ). In this case some_function will actually look up SomeClass in module b, where we have imported it. The patching should look like:

@patch(‘b.SomeClass’)However, consider the alternative scenario where instead of from a import SomeClass module b does import a and some_function uses a.SomeClass. Both of these import forms are common. In this case the class we want to patch is being looked up on the a module and so we have to patch a.SomeClass instead:

@patch(‘a.SomeClass’)

翻译成中文(翻译不好-_-!)

12345678
现在我们想使用patch mock SomeClass测试some_function,但是问题是,当我们导入模块b时,我们将不得不从模块a导入SomeClass,如果我们想patch a.SomeClass发现他对于我们的测试没有任何影响,模块b已经从真正的SomeClass中引用,看起来我们的patch没有被影响。

关键是SomeClass从哪里进行patch,或者从哪里进行查找。在这个示例some_function会从模块b中查找SomeClass,我们也已经导入了,故修改后看起来应该是这样:

@patch(‘b.SomeClass’)

后面就不翻译了...

常见的一些mock

  1. mock class staticmethod
123456789
class Payroll(object):    @staticmethod    def hello():        pass

@patch("where.Payroll.hello")def test_hello(self, mock_hello):    mock_hello.return_value = lambda x: x # example
  1. 如何mock一个异常
1234
with patch(    "addons.hcm.models.payroll.grpc_service.call") as mock_ar:    mock_ar.side_effect = Exception("i wanted.")
  1. mock class method
123456789
class UserResource(object):    def _add(self):        pass

@mock.patch.object(UserResource, "_add")def test_mock_add(self, mock_add):    mock_add.return_value = {} # anything u want.

关于Python的mock相关推荐

  1. Python 中 Mock 到底该怎么玩?一篇文章告诉你(超全)

    1. 前言 微服务架构下,由于各类服务开发进度的不一致,导致联调工作经常会存在不确定性,进而导致项目延期 在实际工作中,为了保证项目进度,我们经常需要针对部分未完成模块及不稳定模块采用 Mock 方式 ...

  2. python实现mock测试

    python + flask+mock实现简单的mock测试 #pip install flask from flask import Flask, request, json,jsonify#实例化 ...

  3. Python之mock service

    我们在与第三方进行联调的时候,经常找不到人,如果一直等待第三方响应,那将是很难受的!所以还不如自己写,想怎么造数据就怎么造-- 下面简单介绍一下如何使用Python编写挡板接口程序mock servi ...

  4. python中mock的使用

    查了很多资料,很多资料都是把mock跟unittest结合在一起讲的,unittest本身是有一定难度的,其实我们完全可以单独使用mock的.参考文献1中把mock讲的很详细,只要静下心来看,必定收获 ...

  5. python使用Mock

    文章目录 背景 问题一:使用mock调用lambda function 问题二: 使用mock操作RDS(mysql) 背景 aws的lambda function使用python完成,python连 ...

  6. python mock_python mock基本使用

    什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x中mock是一 ...

  7. python mock_Python mock 使用心得

    好久没有更新博客, 趁着清明节小长假和我儿子正在睡觉更新一篇刷刷存在感. 近来变化很多, 儿子也有了, 工作上也有很多收获. 这篇博客就分享一下关于 mock 的使用的心得体会. 很长一段时间以来写单 ...

  8. python中mock的基本使用

    什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...

  9. python之mock接口

    一.安装 pip install Flask 二.使用 1.初始化一个flask的对象 app = Flask(__name__) 2.引入装饰器,创建一个接口increaseAs @app.rout ...

最新文章

  1. 你还在认为 count(1) 比 count(*) 效率高?
  2. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  3. 前端一HTML:七:css初步认识
  4. bzoj 2119 股市的预测 —— 枚举关键点+后缀数组
  5. android+包+反编译,简单的Android之apk包反编译方法
  6. Android:解决Button中的文字全部大写
  7. Robotframework集成jenkins执行用例
  8. JavaEE 搜索解决问题集合---会不断更新的
  9. 安全监控、告警及自动化!
  10. Ubuntu18.04之boost警告报错
  11. 如何提升人脸识别的精度_宝比万像人脸识别:健身房人脸识别门禁系统如何助力健身房管理?...
  12. react怎么引入jquery_在react里面使用jquery插件
  13. mysql左连接on后 多个条件_数据库左右连接on后的限制条件问题
  14. fpga驱动步进电机转动指定角度_通过PLC实现步进电机定位控制的方法
  15. 长难句——考研英语刘晓燕#6
  16. 计算机二级考试高级应用软件版本,计算机二级高级办公软件考哪个版本
  17. Adobe 2021正式版发布!全新的adobe2021和2020有哪些区别?
  18. 身份证扫描到一个PDF或图片
  19. JSM-ActiveMQ
  20. 【shell面试题】

热门文章

  1. socket编程——进一步理解accept函数
  2. 若依分离版的文件上传
  3. 记录项目中遇到的坑(三)兼容IE浏览器
  4. 什么是字符串常量池?
  5. SATA 学习笔记2 - Shadow Register和FIS的传输
  6. 阿里巴巴 c语言 笔试题,阿里巴巴校园招聘笔试题目
  7. 同相比造句_对比造句_造句大全
  8. 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark)
  9. session会话中removeAttribute()和invalidate()的区别是什么
  10. linux的shell命令的工作方式,Linux Shell命令的常用方法