参考文章:

版权声明 


出处: 博客园Linux超的技术博客--https://www.cnblogs.com/linuxchao/

您的支持是对博主最大的鼓励,感谢您的认真阅读

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者: Linux超

mock作用

1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以

使用mock模拟被依赖接口,完成目标接口的测试

2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试

3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实

这个和解决接口依赖是一样的原理

4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,是不是你

就停止这部分工作呢?答案是否定的,你完全可以借助mock来模拟后台这个接口返回你想要的数据

 

mock官方文档地址:

https://docs.python.org/3/library/unittest.mock.html#the-patchers

关于@patch.object()的用法截图如下:

实现代码如下:文件名:test_03.py

import requests
import unittest

from mock import patch


class PayApi():

@staticmethod
def auth(card,amount):
pay_url = "http:moni.com"
data = {"card":card,"amount":amount}
response = requests.post(pay_url,data = data)
return response

def pay(self,user_id,card,amount):
response = self.auth(card,amount)
try:
if response['status_code'] == '200':
print("用户{}支付金额{}成功".format(user_id,amount))
return "支付成功"
elif response['status_code'] == '500':
print("用户{}支付失败,金额不变".format(user_id))
return "支付失败"
else:
return "未知错误"
except Exception:
return "Error, 服务器异常!"


class TestPayApi(unittest.TestCase):

def setUp(self):
self.pay = PayApi()

def tearDown(self):
pass

# @mock.patch("test_03.PayApi")
@patch.object(PayApi,'auth')
def test_success(self,mock_auth):
mock_auth.return_value = {'status_code':'200'}
statusmsg = self.pay.pay('1000','12345','10000')
self.assertEqual(statusmsg,'支付成功')

@patch.object(PayApi,'auth')
def test_fail(self,mock_auth):
mock_auth.return_value = {'status_code':'500'}
statusmsg = self.pay.pay('jsdn','6222xxx','10000')
self.assertEqual(statusmsg,'支付失败')

@patch.object(PayApi,'auth')
def test_error(self,mock_auth):
mock_auth.return_value = {'status_code':'300'}
statusmsg = self.pay.pay('jsdn', '6222xxx', '20000')
self.assertEqual(statusmsg,'未知错误')

@patch.object(PayApi, 'auth')
def test_exception(self, mock_auth):
mock_auth.return_value = {'status_codeq':'300'}
statusmsg = self.pay.pay('jsdn', '6222xxx', '20000')
self.assertEqual(statusmsg, 'Error, 服务器异常!')


if __name__ == '__main__':
unittest.main(verbosity=2)

运行结果如下: