在为我的应用程序编写单元测试时,我一直在使用@ mock.patch和@ patch.object装饰器.但是现在,对于我使用装饰器的一些单元测试,我收到一个错误’TypeError:staticmethod object is not iterator’.

但是使用相同的代码,如果我使用mock.patch.object或mock.patch.object,一切正常.

例如,在我的测试类中,我有这个方法:

@staticmethod

def my_mock():

...do something

当我尝试以下单元测试时

@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)

def test_something(self, my_method_mocked):

...test something

我收到’TypeError:staticmethod object is not iterator’之前声明的错误消息.

但是,当我尝试这种方式

def test_something(self):

with patch.object(mymodule, "my_method") as mocked_method:

mocked_method.side_effect = self.my_mock

...test something

一切都很完美.

我已经阅读了有关模拟和单元测试的Python文档,但我找不到任何有关此行为的解释.

使用装饰器模式和with模式有什么区别?哪里可以找到更多相关信息?

为了更清楚,这是我的代码结构:

class TestClass(unittest.TestCase):

@staticmethod

def my_mock():

...mock

return service

# doesn't work

@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)

def test_something(self, my_method_mocked):

...test something

# work

def test_something(self):

with patch.object(mymodule, "my_method") as mocked_method:

mocked_method.side_effect = self.my_mock

...test something

这就是为什么我不能做TestClass.my_mock.如果我这样做,我会收到参考错误.

最佳答案 您正在看到Python的描述符协议的影响.区别不在于您如何调用补丁,而是在每种情况下分配给side_effect属性的值中.

class A(object):

@staticmethod

def my_mock():

pass

print type(my_mock) # As in your decorator case

# As in your context manager case

print type(A.my_mock)

print type(A().my_mock)

如果运行此代码,您将看到类声明中的print语句输出< type’staticmethod’>,因为您有对方法本身的引用.

另外两个打印语句输出< type’function’>因为你没有对方法的引用;你有一个方法的__get__方法的返回值的引用.这两个电话相当于

print type(A.__dict__['my_mock'].__get__(A))

print type(A.__dict__['my_mock'].__get__(A()))

实际的错误是因为patch期望一个callable作为side_effect参数的值,如果失败,它需要一个可迭代的返回值. staticmethod对象既不可调用也不可迭代.

(试一试:A .__ dict __ [‘my_mock’]().)

为确保获得该功能,您需要通过该类访问该方法.

class Foo(object):

@staticmethod

def my_mock():

"whatever it does"

@mock.patch('mypackage.mymodule.my_method', side_effect=Foo.my_mock)

def test_something(self, my_method_mocked):

...test something

python中的object是什么意思_在Python中使用’@ patch.object’和’with patch.object’有什么区别?...相关推荐

  1. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

  2. python里面列表可以同时删除吗_在python中从列表中删除项,同时对其进行迭代

    本问题已经有最佳答案,请猛点这里访问. 我正在为锦标赛应用程序编写循环算法. 当玩家数量为奇数时,我将'DELETE'添加到玩家列表中,但稍后,当我想从包含'DELETE'的日程表列表中删除所有项目时 ...

  3. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  4. python动态更新窗口上的图片_基于Python实现matplotlib中动态更新图片(交互式绘图)...

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  5. python中main.py是什么意思_关于python:什么是__main__.py?

    __main__.py文件是用来做什么的,我应该把什么类型的代码放进去,什么时候应该有一个? 通常,通过在命令行中命名.py文件来运行python程序: $ python my_program.py ...

  6. python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...

    Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...

  7. python中texttable库显示实时数据_用Python串口实时显示数据并绘图pyqtgraph

    用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...

  8. python显示3位数不够0补位_关于Python开发中的那些坑总结,令人防不胜防,建议收藏!...

    在学习 Python 的过程中,我为它的简洁优雅而痴迷,但它又是如此的调皮,在提供了很多舒服的功能特性之外,又悄悄挖了很多带有迷惑性的坑,令人防不胜防- 人不能两次踏入同一条河流,在无数次踩进同样的坑 ...

  9. python金融实务从入门到精通_免费下载中-华尔街学堂:python金融实务从入门到精通,数据实战分析视频教程下载 价值599元...

    华尔街学堂:python金融实务从入门到精通 [4.5G] ┣━━第0章 课时 1 学员须知 [145.5M] ┃ ┗━━课时 2 课程讲义及学习资料 [145.5M] ┃ ┣━━data [92.3 ...

最新文章

  1. 《数字视频和高清:算法和接口》一第2章 图像的采样和显示
  2. [转载]读史记札记23:并不是每次跌倒都能够重新站起来
  3. 3月第3周中国五大顶级域名总量增5.4万 美国减31.5万
  4. unity3d的执行顺序
  5. 【Python】解决TypeError: 'unicode' object does not support item assignment
  6. java学习(153):字符输出流
  7. 【转】Ubuntu 16.04 远程桌面
  8. [网络流24题-6]孤岛营救问题
  9. html大学生活主题班会,我的大学生活主题班会策划书
  10. MATLAB中按点运算“.* ./”和一般运算的区别
  11. Ubuntu18中,使用Python的matplotlib库设置simhei.ttf中文字体并显示
  12. 微型计算机原理实验二,微型计算机原理与接口技术实验指导(第2版)
  13. 拟合数据和原始数据误差计算
  14. HBase:HBase的rowKey设计技巧
  15. linux菜鸟入门之系统启动流程
  16. C语言求1到100的和
  17. 【游戏逆向】游戏玩家技能冷却分析
  18. 腾讯地图位置搜索,标记
  19. 【题解】【AcWing】3374. 进制转换2
  20. C++:函数重载:函数重载深入解析

热门文章

  1. 缓存模式【缓存使用几种模式】【刘新宇】
  2. 劈尖干涉公式_劈尖干涉 牛顿环教案 干涉条纹间距公式
  3. threejs 草场足球运动视角(三)
  4. shell脚本之正则表达式与文本编辑器(一)
  5. 戏言产品三板斧,拿着三宝来作秀
  6. generator(生成器)原理、使用及常见问题集锦
  7. JPA自定义VO接受返回结果集(unwrap)
  8. 后李健熙时代的三星,将迎来怎样变局?
  9. Unity3D学习—打飞碟—工厂模式和适配器模式
  10. Git中tag的用法