Python单元测试模拟类和类方法

2023-11-26

我觉得这可能相对简单,但我正在费尽心思才能让它发挥作用。我想模拟整个类,然后指定该类的方法之一的返回值。

我已经看过了here,在其他几个问题上,当然还有docs。我仍然无法让它发挥作用。请参阅下面我的简单示例。

目录内容tmp:

tmp
├── __init__.py
├── my_module.py
└── test_my_module.py

内容my_module.py:

class MyClass:
    def __init__(self):
        # Do expensive operations that will be mocked in testing.
        self.a = 7

    def my_method(self):
        # For sake of simple example, always return 1.
        return 1


def create_class_call_method():
    """Create MyClass instance and call its my_method method, returning
    the result."""
    instance = MyClass()
    value = instance.my_method()
    return value

内容test_my_module.py:

import unittest
from unittest.mock import patch, Mock

from tmp import my_module


class MyClassTestCase(unittest.TestCase):

    def test_create_class_call_method(self):
        # Attempt to patch MyClass as well as specify a return_value for
        # the my_method method (spoiler: this doesn't work)
        with patch('tmp.my_module.MyClass',
                   my_method=Mock(return_value=2)):
            value = my_module.create_class_call_method()

        self.assertEqual(value, 2)


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

运行结果test_my_module.py:

2 != <MagicMock name='MyClass().my_method()' id='140234477124048'>

Expected :<MagicMock name='MyClass().my_method()' id='140234477124048'>
Actual   :2

我尝试过的其他一些事情:

  • 而不是..., my_method=Mock(return_value=2)) in the patch语句,像这样解压字典:**{'my_method.return_value': 2}
  • Nested with patch声明。外部语句很简单,例如with patch('tmp.my_module.MyClass'):,内部语句尝试修补my_method像这样:with patch('tmp.my_module.MyClass.my_method, return_value=2)
  • 使用补丁装饰器而不是上下文管理器
  • 将补丁声明更改为with patch('tmp.my_module.MyClass') as p:然后在里面with语句,尝试设置p像这样:p.evaluate = Mock(return_value=2)

如有任何帮助,我们将不胜感激,谢谢。


我找到了一个更好的解决方案。简而言之,我们需要模拟return_value of the MyClass嘲笑。这是工作测试代码:

import unittest
from unittest.mock import patch, Mock, MagicMock

from tmp import my_module


class MyClassTestCase(unittest.TestCase):

    def test_create_class_call_method(self):
        # Create a mock to return for MyClass.
        m = MagicMock()
        # Patch my_method's return value.
        m.my_method = Mock(return_value=2)

        # Patch MyClass. Here, we could use autospec=True for more
        # complex classes.
        with patch('tmp.my_module.MyClass', return_value=m) as p:
            value = my_module.create_class_call_method()

        # Method should be called once.
        p.assert_called_once()
        # In the original my_method, we would get a return value of 1.
        # However, if we successfully patched it, we'll get a return
        # value of 2.
        self.assertEqual(value, 2)


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

以及成功的结果:

Ran 1 test in 0.002s

OK
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python单元测试模拟类和类方法 的相关文章

随机推荐

  • 通过单个 API 调用获取包含见解的帖子 - Facebook Graph API

    我想知道是否有一种方法可以通过一次 API 调用获取最近 10 篇帖子及其一些见解 反应 影响力 观点等 目前我正在做的是获取最近 10 篇帖子并循环浏览他们的 ID 以获取他们的见解 但这会减慢请求速度 我期待这样的回应 posts da
  • 测试深层对象结构中属性的存在性

    在 javascript 中 假设我想访问对象深处的属性 例如 Entry mediaGroup 0 contents 0 url 在该结构的任何点上 属性都可能未定义 因此可能无法设置 mediaGroup 简单的说法是什么 if ent
  • PHP 获取标头不适用于 -

    我正在尝试获取 URL 标头的输出 它非常适合子域示例 subdomain example com 我将收到正常消息 HTTP 200 ok 等 但如果子域有 其中标题中不显示任何内容 test tumblr com or test tum
  • css / js 中的自动换行

    我正在寻找一种跨浏览器的方式来包装具有预定宽度的 div 内部没有中断空格 例如长 URL 的长文本部分 以下是我在网上找到的一些解决方案及其原因don t为我工作 溢出 隐藏 自动 滚动 我需要整个文本在不滚动的情况下可见 div 可以垂
  • 同一数据上的多个轴

    我试图在相同的数据上使用两个轴 数据有几个DefaultTableXYDatasets 情节是一个XYPlot 我有两个XYLineAndShapeRenderers和一个StackedXYAreaRenderer2 y 值的所有数据均以米
  • 按(逆)时针顺序排列凹多边形顶点?

    我有一组无序的顶点 可能形成一个凹多边形 现在我想按顺时针或逆时针顺序排列它们 答案在这里建议采取以下步骤 找到多边形中心 计算角度 按角度对点排序 这显然仅适用于凸多边形 当点形成凹多边形时就会失败 我怎样才能对凹面做到这一点 我正在使用
  • 除非打印出来,否则值不会在 while 循环中更新[重复]

    这个问题在这里已经有答案了 好的 所以我有一个监视线程 它检查 ArrayList 的大小 并在该大小大于某个数字后执行某些操作 我现在遇到的问题是大小值永远不会更新 除非我的循环中有打印语句 这是一些代码来展示我到底要做什么 while
  • python中多条线的最近交点

    我需要一个好的算法来计算最接近 python 中的线集合的点 最好使用最小二乘法 我发现这篇关于 python 实现的文章不起作用 在Python中使用最小二乘法找到多条线的中心 我在 Matlab 中发现了这个资源 每个人似乎都喜欢 但我
  • 以编程方式在 Android 屏幕上移动鼠标指针

    我正在开发一个 Android 应用程序 我想在 Android 平板电脑上移动 鼠标 指针 光标 我知道这是可能的 因为当我将鼠标 USB 或 BT 连接到 Android 平板电脑 Honeycomb 时 会出现一个光标 并且我可以仅使
  • 如何在kotlin android中将base64字符串转换为图像

    我有一个表示位图图像的 Base64 字符串 我需要再次将该字符串转换为位图图像 以便在我的 Android 应用程序中的 ImageView 上使用它 怎么做 您可以使用此代码进行解码 val imageBytes Base64 deco
  • Ruby:Titleize:如何忽略较小的单词,如“and”、“the”、“or”等

    def titleize string string split map word word capitalize join end 这给每个单词起了标题 但是我如何捕获某些我不想大写的单词呢 即 杰克和吉尔 并且请不要使用正则表达式 UP
  • `const &&` 是否绑定到所有纯右值(和 xvalues)?

    C 标准定义了以下删除的函数 template
  • 使用 php 使用 WebService

    任何人都可以给我一个如何使用 php 使用以下 Web 服务的示例吗 http www webservicex net uszip asmx op GetInfoByZIP 这是一个使用curl 和GET 接口的简单示例 zip 97219
  • 正则表达式还是异常处理?

    以下哪一项是检查字符串是否浮动的更好做法 try Double parseDouble strVal catch NumberFormatException e My Logic or if strVal matches d d My Lo
  • 需要使用正则表达式对字符串执行通配符(*、?等)搜索

    我需要执行通配符 等 搜索字符串 这就是我所做的 string input Message string pattern d Regex regex new Regex pattern RegexOptions IgnoreCase if
  • 使用电话号码获取来电国家/地区名称? [复制]

    这个问题在这里已经有答案了 您好 有什么方法可以在 Android 手机上获取来电的国家 地区名称吗 Using 库电话号码 public String convertPhoneNumber String phoneNumber Phone
  • 使用 Zend_Db 时如何将值设置为 NULL

    当使用 Zend Db 执行 UPDATE 和 INSERT 查询时 我经常需要将值设置为 NULL 而不是 然而 Zend Db insert 和 Zend Db update 的默认行为似乎是将空值转换为空字符串 并按原样放入数据库中
  • 多次使用@Autowired

    我对春天很陌生 所以我可能会问一些愚蠢的问题 但无论如何 我已经构建了 Spring MVC 4 0 应用程序 我的设置是这样的 控制器 gt gt 服务 gt gt DAO 在控制器级别我使用大约 4 到 5 个不同的 Autowired
  • 如何将 create-react-app 部署到 Google Cloud

    我有一个前端 create react app 和一个使用 Expressjs 的后端 API 我成功地将后端 API 部署到 Google App Engine 但现在我需要将 create react app 部署到 Google Cl
  • Python单元测试模拟类和类方法

    我觉得这可能相对简单 但我正在费尽心思才能让它发挥作用 我想模拟整个类 然后指定该类的方法之一的返回值 我已经看过了here 在其他几个问题上 当然还有docs 我仍然无法让它发挥作用 请参阅下面我的简单示例 目录内容tmp tmp ini