本篇继续介绍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",再通过实例去调用方法

最新文章

  1. surface pro 4 wifi掉线问题
  2. 迷你MVVM框架 avalonjs1.5 入门教程
  3. sql2000新建登陆用户错误“21002:[SQL-DMO] 用户***已经存在”的原因和解决方法【孤立用户解决方法】
  4. select count(*)和select count(1)哪个性能高
  5. Java中的类加载器----ClassLoader
  6. Oracle —— 函数 length() 和 lengthb() 的区别
  7. Jackson - Date Handling
  8. Percona-Server-5.5.33-31.1安装
  9. UIAlertController (UIActionSheet, UIAlertView is deprecated in iOS 8.)
  10. ORDER BY RAND()
  11. MongoDB数据模型(二)
  12. webstom,zencoding,windows快捷键
  13. 学习docker on windows (1): 为什么要使用docker
  14. 阿里云服务器建站——centos7部署apache+mysql+php
  15. 【Linux】gdb调试
  16. zookeeper分布式服务中选主的应用
  17. ScheduledThreadPoolExecutor源码解读
  18. Excel学习笔记:if({1,0})用法
  19. 通过T4模板实现代码自动生成
  20. MVC使用jQuery.ajax()删除数据

热门文章

  1. Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  2. Nginx重写规则
  3. Java开发笔记(九十五)NIO配套的文件工具Files
  4. AJPFX总结匿名类及其使用
  5. re正则表达式公式讲解3
  6. Java编译时根据调用该方法的类或对象所属的类决定
  7. 螺旋数字的python实现
  8. Django创建第一个应用
  9. 【opencv】imread CV_LOAD_IMAGE_GRAYSCALE
  10. Django-常用设置(settings.py)