本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数
官方文档地址

patch简介

1.unittest.mock.patch(target,new = DEFAULT,spec = None,create =
False,spec_set = None,autospec = None,new_callable = None,** kwargs )

  • target参数必须是一个str,格式为'package.module.ClassName',
    注意这里的格式一定要写对,如果你的函数或类写在pakege名称为a下,b.py脚本里,有个c的函数(或类),那这个参数就写“a.b.c”

  • new参数如果没写,默认指定的是MagicMock
  • spec=True或spec_set=True,这会导致patch传递给被模拟为spec / spec_set的对象
  • new_callable允许您指定将被调用以创建新对象的不同类或可调用对象。默认情况下MagicMock使用。

函数案例讲解

1.接着上一篇python笔记23-unittest单元测试之mock,新建一个temple.py,写入以下代码

def zhifu():
    '''假设这里是一个支付的功能,未开发完
        支付成功返回:{"result": "success", "reason":"null"}
        支付失败返回:{"result": "fail", "reason":"余额不足"}
        reason返回失败原因
        '''
    pass

def zhifu_status():
    '''根据支付的结果success or fail,判断跳转到对应页面'''
    result = zhifu()
    print(result)
    try:
        if result["result"] == "success":
            return "支付成功"
        elif result["result"] == "fail":
            print("失败原因:%s" % result["reason"])
            return "支付失败"
        else:
            return "未知错误异常"
    except:
        return "Error, 服务端返回异常!"

2.用mock.patch实现如下:

from unittest import mock
import unittest
import test_case.temple as temple

class Test_zhifu_status(unittest.TestCase):
    @mock.patch("test_case.temple.zhifu")  #patch格式必须是 包名.文件名.类名
    def test_01(self,mock_zhifu):
        '''测试支付成功场景'''
        # 方法一:mock一个支付成功的数据
        # temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"})

        # 方法二:mock.path装饰器模拟返回结果
        mock_zhifu.return_value = {"result": "success", "reason": "null"}
        # 根据支付结果测试页面跳转
        status=temple.zhifu_status()
        print(status)
        self.assertEqual(status,"支付成功")

    @mock.patch("test_case.temple.zhifu")
    def test_02(self,mock_zhifu):
        '''测试支付失败场景'''
        # 方法一:mock一个支付成功的数据
        # temple.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})

        # 方法二:mock.path装饰器模拟返回结果
        mock_zhifu.return_value = {"result": "fail", "reason": "余额不足"}
        # 根据支付结果测试页面跳转
        status = temple.zhifu_status()
        self.assertEqual(status, "支付失败")

if __name__ == "__main__":
    unittest.main()
 

类和方法案例

1.如果前面的temple.py里面不是函数,是写的类和方法,如何去使用mock?

class Zhifu():
    def zhifu(self):
        '''假设这里是一个支付的功能,未开发完
            支付成功返回:{"result": "success", "reason":"null"}
            支付失败返回:{"result": "fail", "reason":"余额不足"}
            reason返回失败原因
            '''
        pass

class Status():
    def zhifu_status(self):
        '''根据支付的结果success or fail,判断跳转到对应页面'''
        result = Zhifu().zhifu()
        print(result)
        try:
            if result["result"] == "success":
                return "支付成功"
            elif result["result"] == "fail":
                print("失败原因:%s" % result["reason"])
                return "支付失败"
            else:
                return "未知错误异常"
        except:
            return "Error, 服务端返回异常!"

2.用例设计如下

from unittest import mock
import unittest
from test_case.temple import Zhifu,Status

class Test_zhifu_status(unittest.TestCase):
    @mock.patch("test_case.temple.Zhifu")  #patch格式必须是 包名.文件名.类名(或者函数名)
    def test_01(self,mock_zhifu):
        '''测试支付成功场景'''
        a=mock_zhifu.return_value #返回实例,对类名称替换

        # 方法二:mock.path装饰器模拟返回结果
        # 通过实例调用方法,再对方法的返回值替换
        a.zhifu.return_value = {"result": "success", "reason": "null"}
        # 根据支付结果测试页面跳转
        status=Status().zhifu_status()
        print(status)
        self.assertEqual(status,"支付成功")

    def test_02(self):#,mock_zhifu):
        '''测试支付失败场景'''
        #b=mock_zhifu.return_value
        # 方法一:mock一个支付成功的数据
        Zhifu.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})

        # 根据支付结果测试页面跳转
        status = Status().zhifu_status()
        self.assertEqual(status, "支付失败")

if __name__ == "__main__":
    unittest.main()

3.相当于函数来说,这里主要多一步,要先对类的名称进行mock一次"a = mock_Zhifu.return_value",再通过实例去调用方法

python mock模块使用(二)的更多相关文章

  1. python mock模块使用(一)

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...

  2. python标准模块(二)

    本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...

  3. python常用模块(二)

    1.ConfigParser模块 用于生成和修改配置文档,在python3.x中变更为configparser 1 [DEFAULT] 2 ServerAliveInterval = 45 3 Com ...

  4. Python unittest模块心得(二)

    基础概念介绍请参看: http://www.cnblogs.com/frost-hit/p/8295818.html 组织测试用例 unittest.TestSuite(tests=()): 除了使用 ...

  5. Python学习笔记总结(二)函数和模块

    一.函数 函数的作用:可以计算出一个返回值,最大化代码重用,最小化代码冗余,流程的分解. 1.函数相关的语句和表达式 语句        例子 Calls        myfunc(‘diege', ...

  6. python基础-------模块与包(二)

    sys模块.logging模块.序列化 一.sys模块 sys.argv           命令行参数List,第一个元素是程序本身路径 sys.exit(n)        退出程序,正常退出时e ...

  7. 使用Python中的mock模块进行单元测试

    在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...

  8. Python学习 :常用模块(二)

    常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir( ...

  9. python并发模块之concurrent.futures(二)

    python并发模块之concurrent.futures(二) 上次我们简单的了解下,模块的一些基本方法和用法,这里我们进一步对concurrent.futures做一个了解和拓展.上次的内容点这. ...

随机推荐

  1. Discovering Gold LightOJ - 1030 || 概率与期望求法区别

    #include<cstdio>//wrong_codes #include<algorithm> using namespace std; ],anss; ],T,TT,n, ...

  2. 1-13Object类之toString方法

    Object中的toString方法 SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式. 在现实的开发过程中,Object中的toString方法就是要被重写的 ...

  3. [已读]HTML5与CSS3设计模式

    我想说,不要被书名骗了,其实并没有涉及丁点h5与css3的内容,但是确实称得上比较详细的一本关于css的书.看它的页数就知道了,481~~ 今年上半年看完的,现在想想,觉得自己还是蛮拼的.内容会比较枯 ...

  4. Vue nextTick 理解

    官网解释: 将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 DOM 更新.它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例 ...

  5. Masonry自动布局与UIScrolView适配

    Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X.可以通过cocoa ...

  6. re正则表达式讲解—初步认识

    # f = open(r"C:\Users\LENOVO\Desktop\模特.txt",'r') # 1.常规提取文档内容方法 # contacts = [] # for i i ...

  7. elasticsearch 2.4.0安装说明

    首先从官网下载安装包,是个压缩文件,然后解压 在es目录下找到es的配置文件 修改集群(cluster)名称 PS:一般情况下一台机只部署一个es程序,也就是一个集群,默认集群名是ewater_mai ...

  8. OFDM、FTTx、SCTP、Ad Hoc、WSN术语简介

    上课提到一些术语,下来查了一下,总结在这里. OFDM: OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(M ...

  9. 3.12 在运算和比较时使用NULL值

    问题:NULL值永远不会等于或不等于任何值,也包括NULL值自己,但是需要像计算真实值一样计算可为空列的返回值.例如,需要在表emp中查出所有比“WARD”提成(COMM)低的员工,提成为NULL(空 ...

  10. diff - 找出两个文件的不同点

    总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, dif ...