一些常用的mock示例

先简单定义个类,方便举例:

class Person:

def __init__(self):

self.__age = 10

def get_fullname(self, first_name, last_name):

return first_name + ' ' + last_name

def get_age(self):

return self.__age

@staticmethod

def get_class_name():

return Person.__name__

这个类里有两个成员方法,一个有参数,一个无参数。还有一个静态方法

mock成员方法

1. 使用Mock类,返回固定值

class PersonTest(TestCase):

def test_should_get_age(self):

p = Person()

# 不mock时,get_age应该返回10

self.assertEqual(p.get_age(), 10)

# mock掉get_age方法,让它返回20

p.get_age = Mock(return_value=20)

self.assertEqual(p.get_age(), 20)

def test_should_get_fullname(self):

p = Person()

# mock掉get_fullname,让它返回'James Harden'

p.get_fullname = Mock(return_value='James Harden')

self.assertEqual(p.get_fullname(), 'James Harden')

2. 校验参数个数,再返回固定值

上面的例子你也许已经注意到了,调用p.get_fullname时没有给任何的参数,但是依然可以工作。

如果想校验参数需要用create_autospec模块方法替代Mock类。

class PersonTest(TestCase):

def test_should_get_fullname(self):

p = Person()

p.get_fullname = create_autospec(p.get_fullname, return_value='James Harden')

# 随便给两个参数,依然会返回mock的值

self.assertEqual(p.get_fullname('1', '2'), 'James Harden')

# 如果参数个数不对,会报错TypeError: missing a required argument: 'last_name'

p.get_fullname('1')

3. 使用side_effect, 依次返回指定值

class PersonTest(TestCase):

def test_should_get_age(self):

p = Person()

p.get_age = Mock(side_effect=[10, 11, 12])

self.assertEqual(p.get_age(), 10)

self.assertEqual(p.get_age(), 11)

self.assertEqual(p.get_age(), 12)

4. 根据参数不同,返回不同的值

class PersonTest(TestCase):

def test_should_get_fullname(self):

p = Person()

values = {('James', 'Harden'): 'James Harden', ('Tracy', 'Grady'): 'Tracy Grady'}

p.get_fullname = Mock(side_effect=lambda x, y: values[(x, y)])

self.assertEqual(p.get_fullname('James', 'Harden'), 'James Harden')

self.assertEqual(p.get_fullname('Tracy', 'Grady'), 'Tracy Grady')

5. 抛出异常

class PersonTest(TestCase):

def test_should_raise_exception(self):

p = Person()

p.get_age = Mock(side_effect=TypeError('integer type'))

# 只要调就会抛出异常

self.assertRaises(TypeError, p.get_age)

6. 检验是否调用

class PersonTest(TestCase):

def test_should_validate_method_calling(self):

p.get_fullname = Mock(return_value='James Harden')

# 没调用过

p.get_fullname.assert_not_called() # Python 3.5

p.get_fullname('1', '2')

# 调用过任意次数

p.get_fullname.assert_called() # Python 3.6

# 只调用过一次, 不管参数

p.get_fullname.assert_called_once() # Python 3.6

# 只调用过一次,并且符合指定的参数

p.get_fullname.assert_called_once_with('1', '2')

p.get_fullname('3', '4')

# 只要调用过即可,必须指定参数

p.get_fullname.assert_any_call('1', '2')

# 重置mock,重置之后相当于没有调用过

p.get_fullname.reset_mock()

p.get_fullname.assert_not_called()

# Mock对象里除了return_value, side_effect属性外,

# called表示是否调用过,call_count可以返回调用的次数

self.assertEqual(p.get_fullname.called, False)

self.assertEqual(p.get_fullname.call_count, 0)

p.get_fullname('1', '2')

p.get_fullname('3', '4')

self.assertEqual(p.get_fullname.called, True)

self.assertEqual(p.get_fullname.call_count, 2)

mock静态方法

静态方法和模块方法需要使用patch来mock。

1. 在测试方法参数中得到Mock对象

class PersonTest(TestCase):

# 以字符串的形式列出静态方法的路径,在测试的参数里会自动得到一个Mock对象

@patch('your.package.module.Person.get_class_name')

def test_should_get_class_name(self, mock_get_class_name):

mock_get_class_name.return_value = 'Guy'

self.assertEqual(Person.get_class_name(), 'Guy')

2. 在patch中设置Mock对象

class PersonTest(TestCase):

mock_get_class_name = Mock(return_value='Guy')

# 在patch中给出定义好的Mock的对象,好处是定义好的对象可以复用

@patch('your.package.module.Person.get_class_name', mock_get_class_name)

def test_should_get_class_name(self):

self.assertEqual(Person.get_class_name(), 'Guy')

3. 使用patch.object

class PersonTest(TestCase):

mock_get_class_name = Mock(return_value='Guy')

# 使用patch.object来mock,好处是Person类不是以字符串形式给出的

@patch.object(Person, 'get_class_name', mock_get_class_name)

def test_should_get_class_name(self, ):

self.assertEqual(Person.get_class_name(), 'Guy')

4. 使用with控制作用域

class PersonTest(TestCase):

# 作用域之外,依然返回真实值

def test_should_get_class_name(self, ):

mock_get_class_name = Mock(return_value='Guy')

with patch('your.package.module.Person.get_class_name', mock_get_class_name):

self.assertEqual(Person.get_class_name(), 'Guy')

self.assertEqual(Person.get_class_name(), 'Person')

mock链式调用

在django里,我们经常需要mock数据库,而访问数据库时经常是链式调用,看个例子。

def get_person(name):

return Person.objects.filter(name=name).order_by('age')

有个模块方法,返回数据库中所有指定name的人员,并按age排序

mock掉整个数据库访问

@patch('your.package.module.Person.objects.filter')

def test_should_get_person(self, mock_filter):

# 先得到一个filter的Mock对象,再在return_value中设置一个Mock对象,此时不需要自己再创建

mock_filter.return_value.order_by.return_value = None

self.assertIsNone(get_person())

python2.7 mysql mock_Python中Mock的示例相关推荐

  1. aspx mysql类_aspx中的mysql操作类sqldatasource使用示例分享

    复制代码 代码如下: /p> "http://www.w3.org/TR/xhtmlll/DTD/xhtmlll.dtd"> asp.net to mysql asp. ...

  2. mysql or_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

  3. mock.js 在html中使用demo示例代码

    mock.js 在html中使用demo示例代码 <!DOCTYPE html> <html lang="en"> <head><meta ...

  4. postgres语法_SQL Create Table解释了MySQL和Postgres的语法示例

    postgres语法 A table is a group of data stored in a database. 表是存储在数据库中的一组数据. To create a table in a d ...

  5. echarts导入mysql数据库_Echarts最新:Django中从mysql数据库中获取数据传到echarts方式_爱安网 LoveAn.com...

    关于"Echarts"的最新内容 聚合阅读 这篇文章主要介绍了基于vue+echarts 数据可视化大屏展示的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...

  6. php过滤数据库就报错,php过滤掉emoji等无法存入MySQL数据库的字符简单示例

    这篇文章主要为大家详细介绍了php过滤掉emoji等无法存入MySQL数据库的字符简单示例,具有一定的参考价值,可以用来参考一下. 对php过滤掉emoji等无法存入MySQL数据库的字符简单示例感兴 ...

  7. Python3调用MySQL数据库中的数据

    在学习<Designing Machine Learning Systems with Python>(中文名<机器学习系统设计--Python语言实现>)一书中,在第三章第二 ...

  8. MySQL查询中LIMIT的大offset导致性能低下浅析

    这篇文章主要给大家介绍了关于MySQL查询中LIMIT的大offset导致性能低下的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起 ...

  9. 怎么在linux下用mysql建库_在MySQL/MariaDB中创建数据库、数据库用户和授予特权(针对Linux平台)...

    在本文中,将学习MySQL/MariaDB数据库创建.数据库用户创建以及如何向用户授予权限,方法针对Linux平台.安装数据库请参考为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8 ...

最新文章

  1. Selenium3自动化测试——10.为百度搜索设置弹窗
  2. 大战设计模式【17】—— 建造者模式
  3. SpringBoot中自定义Banner(启动图案)
  4. Spring框架中的设计模式(五)
  5. CONVERT_YEAR_WITH_THRESHOLD
  6. Apache https服务器配置笔记
  7. STM32 IO口的八种模式使用小结
  8. Vue 监视属性 watch
  9. 美国进步派民主党众议员寻求大幅扩大拜登第二项支出计划规模
  10. 小心:光缆损毁 敲诈病毒现身互联网
  11. 移动应用前端h5框架汇总
  12. 移动安全-Android安全测试框架Drozer
  13. 【音效素材】网络热门音效大合集,短视频必备(都是经典音效,质量不错)
  14. “狗屁不通”文章生成器网页版代码
  15. Landsat系列卫星
  16. 北京市居民公共交通出行特征分析
  17. 具体怎么使用视频播放屏幕的感重力切换横竖屏
  18. Servlet execution threw an exception
  19. 【白帽子讲Web安全】第二章 浏览器安全
  20. HCM 初学 ( 二 ) - 信息类型

热门文章

  1. ubunntu安装php7.0_在 Ubuntu/Debian 下安装 PHP7.3 教程
  2. python制作统计图_刻意练习11:Python描述统计、简单统计图形
  3. 剑指offer:面试题19. 正则表达式匹配
  4. 360浏览器如何设置为像chrome谷歌浏览器那样输入网址回车在当前页面,而不是新建一个标签打开
  5. 玻璃和水晶PBR纹理材质预设
  6. 设计模式 之美 -- 策略模式
  7. shell --- trap 抓取信号
  8. python基础之常用模块
  9. Database项目中关于Procedure sp_refreshsqlmodule_internal的错误
  10. win7,windowsXP安装mysql-5.1.49-win32,中文版、英文版,通吃