如何在Python unittest中用自定义类Mock目标类而非实例?
解决unittest.patch用自定义类替换原类的问题
问题根源
你当前使用new_callable=B的方式是错误的:new_callable参数的作用是让patch调用传入的对象(这里是类B)生成一个实例,然后用这个实例去替换原类A。这就导致libutil.util.A被替换成了B的实例,当你执行A()时,本质是在调用一个对象,自然会抛出TypeError: 'B' object is not callable。
正确实现方式
要直接用类B替换类A,需要使用patch的new参数,直接传入B类本身,而不是让patch去创建实例:
@pytest.fixture(scope="session", autouse=True) def mock_util(): from tests.libraries.mocks.util import B with mock.patch('libutil.util.A', new=B, create=False) as util_mock: yield util_mock
验证效果
修改后,当你执行a = libutil.util.A()时,实际创建的是B类的实例:
- 调用
a.g()会返回"Hi from child"(B类重写的方法) a.c的值为"parent"(继承自A类的属性)
完全符合你用B类Mock A类的需求。
内容的提问来源于stack exchange,提问作者2_slow
相关产品推荐
相关产品推荐

