You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单元测试:如何将自定义方法绑定到Mock()实例中?

问题根因

你当前的写法有两个核心问题:

  1. 定义在测试类里的fake_process_row没有加@staticmethod装饰器,调用时第一个参数会被自动注入测试类实例self,你代码里写的形参row实际拿到的是测试类对象,不是你传入的row字典。
  2. 如果你用Mock对象,直接给属性赋值普通函数无法正确透传参数,需要用side_effect属性绑定自定义执行逻辑。

解法1:用side_effect绑定自定义逻辑(推荐)

Mock对象的side_effect属性可以直接绑定自定义函数,调用时会把参数透传给绑定的函数,返回函数的执行结果,还能保留Mock的调用次数、参数校验等能力:

import unittest
from unittest.mock import Mock

# 你的业务函数
def create_row(row_content, datahandler):
  row = {}
  # Here comes some code that fills the "row" dictionary based on what was passed in row_content
  row = datahandler.process_row(row)
  # some more handling happens to the processed row 
  return row

class TestCreateRow(unittest.TestCase):
  # 加staticmethod装饰器,避免自动注入self参数
  @staticmethod
  def fake_process_row(row): 
    # 可自定义逻辑,比如修改row、打印参数等
    return row

  def test_create_row(self):
    # 按业务逻辑构造row_content即可
    row_content = {}
    expected = {"first column":"first value", "second column":"second value"}
    datahandler = Mock()
    # 核心修改:把自定义函数赋值给side_effect
    datahandler.process_row.side_effect = self.fake_process_row
    result = create_row(row_content, datahandler)
    self.assertDictEqual(expected, result)
    # 额外可加断言验证方法调用符合预期
    datahandler.process_row.assert_called_once_with(expected)

解法2:直接构造极简模拟对象,不用Mock

如果你不需要Mock的调用统计等能力,只想要一个带指定方法的轻量模拟对象,可以直接用空类实现,完全没有额外逻辑,行为和真实类实例100%一致:

def test_create_row(self):
    row_content = {}
    expected = {"first column":"first value", "second column":"second value"}
    # 直接定义模拟类,仅实现需要的方法
    class FakeDatahandler:
        @staticmethod
        def process_row(row):
            return row
    datahandler = FakeDatahandler()
    result = create_row(row_content, datahandler)
    self.assertDictEqual(expected, result)

内容的提问来源于stack exchange,提问作者rumtscho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:54:05