Python单元测试:如何将自定义方法绑定到Mock()实例中?
问题根因
你当前的写法有两个核心问题:
- 定义在测试类里的
fake_process_row没有加@staticmethod装饰器,调用时第一个参数会被自动注入测试类实例self,你代码里写的形参row实际拿到的是测试类对象,不是你传入的row字典。 - 如果你用
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
相关产品推荐
相关产品推荐

