博客
关于我
Python mock 修补另一个函数调用的函数
阅读量:800 次
发布时间:2023-03-06

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

在Python编程中,当我们需要测试某些函数的行为时,使用 unittest.mock 库来模拟函数调用是一个非常有用的方法。这种技术可以帮助我们在测试过程中完全控制函数的行为,从而更好地验证我们的代码是否符合预期。

如何使用Python mock模拟函数调用

假设我们有一个需要测试的函数 add(a, b),它的作用是返回两个数的和。为了模拟这个函数的行为,我们可以使用 unittest.mock 库。

  • 导入必要的模块

    首先,我们需要导入 unittest.mock 库中的 patchMock 类,这些工具将帮助我们模拟函数的行为。通常,我们会在测试类中使用这些工具。

  • 创建测试类

    我们将创建一个测试类 TestMyFunction,在这个类中,我们将定义一个测试方法,用于验证我们的模拟函数是否正常工作。

  • 使用 @patch 装饰器

    在测试方法中,我们使用 @patch('MyModule.add') 装饰器来替换原本的 add 函数。这里的 MyModule 是包含我们要测试的模块名称。替换后的函数将被 Mock 对象代替,这样我们可以完全控制它的行为。

  • 设置 mock 对象的行为

    在测试方法中,我们可以设置 mock 对象的返回值、调用次数以及其他属性。例如,如果我们想模拟 add 函数返回一个固定的值,我们可以执行以下操作:

    mocked_add.return_value = 5
  • 调用需要测试的函数

    接下来,我们需要调用包含 add 函数调用的函数。例如,如果我们有一个函数 do_something,它调用了 add 函数,那么我们可以执行:

    result = MyModule.do_something()
  • 验证函数调用情况

    最后,我们需要验证 add 函数是否被正确调用。我们可以检查:

    • 函数是否被调用过:

      self.assertTrue(mocked_add.called)
    • 函数是否被调用了一次:

      self.assertEqual(mocked_add.call_count, 1)
    • 函数是否接收了正确的参数:

      self.assertEqual(mocked_add.call_args, (3, 4))
  • 验证返回值

    如果 do_something 函数返回了一个值,我们可以检查这个值是否与预期一致:

    self.assertEqual(result, 10)
  • 完整示例代码

    import unittestfrom unittest.mock import patch, Mockimport myModule  # 假设这个模块包含我们要测试的函数class TestMyFunction(unittest.TestCase):    @patch('MyModule.add')    def test_my_function(self, mocked_add):        # 设置 mock 对象的返回值        mocked_add.return_value = 5                # 调用需要测试的函数        result = MyModule.do_something()                # 检查 add 函数是否被调用        self.assertTrue(mocked_add.called)        self.assertEqual(mocked_add.call_count, 1)        self.assertEqual(mocked_add.call_args, (3, 4))                # 检查 do_something 函数的返回值        self.assertEqual(result, 10)

    运行测试

    最后,我们需要运行这个测试。可以在代码的末尾添加以下内容:

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

    通过以上步骤,我们就成功地使用 unittest.mock 模拟了另一个函数的调用,并且可以在测试中验证函数的行为。这是一种非常有用的技术,特别是在单元测试时非常实用。

    转载地址:http://coafk.baihongyu.com/

    你可能感兴趣的文章
    python Windows显示当前鼠标坐标
    查看>>
    python Workbook 表格宽度
    查看>>
    python write报错a byte-like object is required.not str
    查看>>
    PYTHON调用大模型实现图片生成
    查看>>
    python yaml.dump 缩进错误
    查看>>
    Python yield generator
    查看>>
    Python yield 使用浅析
    查看>>
    Python yield解析:深入理解生成器的魔力
    查看>>
    Python You are using pip version 10.0.1, however version 19.3.1 is available.
    查看>>
    python zipfile模块学习笔记(一)
    查看>>
    Python zip函数 详解(全)
    查看>>
    Python \r\n与\n的转换
    查看>>
    python __new__中单例的作用
    查看>>
    python | aiofiles,一个超酷的 Python 库!
    查看>>
    python | akshare,一个超强的 开源Python 金融数据接口库!
    查看>>
    python | alabaster,一个强大的 关于alabaster 主题 Python 库!
    查看>>
    python | algorithms,一个超赞的 集合常用算法的Python 库!
    查看>>
    python调用jpype 报错:OSError JVM is already started和JVM cannot be restarted
    查看>>
    python | authlib,一个强大的 Python 库!
    查看>>
    python | awswrangler,一个高效的 Python 库!
    查看>>