博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中mock的使用
阅读量:5945 次
发布时间:2019-06-19

本文共 2864 字,大约阅读时间需要 9 分钟。

 

接下来我们看下mock方法中的几个参数

一、name参数

name是标志了唯一的一个mock名,具有唯一的一个mockid:

import mocktest_mock = mock.Mock(name='test')print(test_mock)-----结果-----

  

二、return_value参数

return_value指定的是某个返回的值,可以是一个变量,也可以是一个对象

2.1mock一个变量值

import mock mock_test1 = mock.Mock(return_value='test')print(mock_test1())-----结果-----test

  

2.2mock一个类的对象

import mock#首先创建一个类class Person:    _age = 18    def get_age(self):        print(self._age)    def get_name(self, name):        print(name)p = Person()      mock_person = mock.Mock(return_value=p)   #把对象p的地址赋值给return_valuemock_p = mock_person()                    #调用mock对象,mock_p对象的地址和p对象地址一样print(mock_p.get_age())                   #查看mock对象的_age值print(mock_p.get_name('nee'))             #调用mock对象的方法,查看name值-----结果-----

 

2.3 mock一个类中的方法

class Person:    _age = 18    def get_age(self):        return self._agep = Person()print(p.get_age())                         #不使用mockp.get_age = mock.Mock(return_value=17)     #使用mockprint(p.get_age())-----结果-----1817

如果这个方法中需要参数呢?如下:

class Person:    _age = 18    def get_age(self):        return self._age    def get_name(self, name):        return namep = Person()p.get_name = mock.Mock(return_value='nee')print(p.get_name())                         #无参数print(p.get_name('cai'))                    #有参数-----结果-----neenee

  由此可见,不需要任何参数,都能mock出相应的内容

 

三、side_effect参数

3.1抛出异常

import mocktest_mock = mock.Mock(return_value='test', side_effect=KeyError)print(test_mock())-----结果-----..    raise effectKeyError

  

3.2指定的参数的值是一个list或者tuple,可以依次返回指定值,有点类似于迭代器

import mocktest_list = [1, 2, 3]test_mock = mock.Mock(return_value='test', side_effect=test_list)print(test_mock())print(test_mock())print(test_mock())print(test_mock())-----结果-----123..    result = next(effect)StopIteration

  

4.spec参数:

4.1指定的是属性组成的list 

import mock
test_list = ['age', 'name'] test_mock = mock.Mock(spec=test_list) print(test_mock) print(test_mock.age) print(test_mock.name)
-----结果----- 

 

4.2指定的是一个类属性:

class Person:    _age = 18    def get_age(self):        print(self._age)    def get_name(self, name):        print(name)mock_p = mock.Mock(spec=Person)print(mock_p)print(mock_p.get_age())print(mock_p.get_name())-----结果-----

  

 

二、检验mock使用情况

  assert_called_once()                 只调用过一次

  assert_called_once_with()         只调用过一次,且符合参数

  assert_called()                         调用过任意次

  assert_not_called()                   没调用过

  assert_any_call()                      调用过一次即可,且符合参数

  assert_called_with()                 

  举例:

class Person:    def __init__(self):        self.age = 10    def get_full_name(self, first_name, last_name):        return first_name + ' ' + last_name    def get_age(self):        return self.agep = Person()p.get_name = mock.Mock(return_value='nee')p.get_name()p.get_name.assert_not_called()-----结果-----AssertionError: Expected 'mock' to not have been called. Called 1 times.

  

 

转载于:https://www.cnblogs.com/nizhihong/p/10040818.html

你可能感兴趣的文章
我是怎么使用最短路径算法解决动态联动问题的
查看>>
URAL 1353 Milliard Vasya's Function DP
查看>>
速读《构建之法:现代软件工程》提问
查看>>
Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
查看>>
django中聚合aggregate和annotate GROUP BY的使用方法
查看>>
TFS简介
查看>>
docker管理平台 shipyard安装
查看>>
安装django
查看>>
Bootstrap3 栅格系统-简介
查看>>
ADODB类库操作查询数据表
查看>>
【java】File的使用:将字符串写出到本地文件,大小0kb的原因
查看>>
安卓音乐播放器开发实例
查看>>
some requirement checks failed
查看>>
存储管理
查看>>
HDU-2089-不要62
查看>>
Latex学习笔记0
查看>>
css控制div强制换行
查看>>
ios 底部用定位 fixed。在软件盘出来后,页面元素被顶上去一部分,fixed定位的footer也跑到了上面去。解决方法...
查看>>
HDU1257题解
查看>>
Iterator
查看>>