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

如何在测试中替换类并验证其方法是否被调用?

替换类并验证方法调用的正确实现

你的原代码存在两个核心问题:

  1. 用patch("__main__.A", new=B)替换后,mocked_a指向的是B类本身,而some_method是实例方法,直接断言类的方法调用不成立。
  2. 真实的B类没有被Mock包装,无法追踪实例方法的调用记录。

以下是两种可行的解决方案:

方案1:用Mock模拟B类行为(推荐)

不需要真实执行B类的逻辑,仅验证调用时使用此方案:

from unittest.mock import patch, Mock

class A:
    def some_method(self):
        print("A")

class B:
    def some_method(self):
        print("B")

def some_function():
    a = A()
    a.some_method()

def test_some_function():
    # 创建Mock实例,模拟B类的方法签名
    mock_b_instance = Mock(spec=B)
    # 让被替换后的A类返回这个Mock实例
    with patch("__main__.A", return_value=mock_b_instance):
        some_function()
        # 验证实例的some_method被调用一次
        mock_b_instance.some_method.assert_called_once()

方案2:替换为真实B类并追踪方法调用

如果需要真实执行B类的逻辑,同时验证方法调用:

from unittest.mock import patch

class A:
    def some_method(self):
        print("A")

class B:
    def some_method(self):
        print("B")

def some_function():
    a = A()
    a.some_method()

def test_some_function():
    # 先将A替换为真实的B类,再给B的some_method打补丁
    with patch("__main__.A", new=B), patch.object(B, "some_method") as mocked_method:
        some_function()
        # 验证方法被调用一次
        mocked_method.assert_called_once()

关键说明

  • 方案1的核心是让被替换的A类返回一个Mock实例,这样可以直接追踪实例方法的调用。
  • 方案2通过嵌套补丁,先替换类,再对目标类的方法进行Mock,从而在保留真实逻辑的同时记录调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:32:22