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

如何在Pytest中Mock内部方法的默认参数?

在Pytest中Mock方法默认参数的几种实现方式

针对你的场景,要把Repository._get_metadata的默认version参数从DEFAULT_VERSION替换为测试用的TEST_DEFAULT_VERSION,可以用以下几种方法:

方法1:直接Mock类的DEFAULT_VERSION属性

因为_get_metadata的默认参数引用的是类属性DEFAULT_VERSION,所以直接修改这个属性就能改变默认参数值。可以用unittest.mock.patch实现:

from unittest.mock import patch
from your_module import Repository

class TestRepository:
    TEST_DEFAULT_VERSION = "0.2.20"

    @patch("your_module.Repository.DEFAULT_VERSION", TEST_DEFAULT_VERSION)
    def test_write(self, test_df):
        repo = Repository()
        repo.write(test_df, id="1")
        
        # 这里_get_metadata会使用TEST_DEFAULT_VERSION作为默认version参数
        # 后续添加你的断言逻辑,比如验证写入结果或方法调用

注意:patch的路径要和被测试代码中导入Repository的路径一致,确保修改的是被测试代码实际使用的类属性。

方法2:Mock _get_metadata方法并验证参数

如果不需要真实执行_get_metadata方法,而是想直接控制它的返回值并验证调用参数,可以直接Mock这个方法:

from unittest.mock import patch
from your_module import Repository

class TestRepository:
    TEST_DEFAULT_VERSION = "0.2.20"

    def test_write(self, test_df):
        with patch.object(Repository, "_get_metadata") as mock_get_meta:
            # 模拟方法返回值
            mock_get_meta.return_value = {"version": self.TEST_DEFAULT_VERSION}
            
            repo = Repository()
            repo.write(test_df, id="1")
            
            # 验证方法被调用时,version参数确实是我们指定的测试值
            mock_get_meta.assert_called_once_with("1", version=self.TEST_DEFAULT_VERSION)
            
            # 添加其他断言逻辑

方法3:使用pytest的monkeypatch fixture

pytest自带的monkeypatch fixture可以方便地修改类属性:

from your_module import Repository

class TestRepository:
    TEST_DEFAULT_VERSION = "0.2.20"

    def test_write(self, test_df, monkeypatch):
        # 修改Repository类的DEFAULT_VERSION属性
        monkeypatch.setattr(Repository, "DEFAULT_VERSION", self.TEST_DEFAULT_VERSION)
        
        repo = Repository()
        repo.write(test_df, id="1")
        
        # 执行断言,比如验证写入行为符合预期

方法选型建议

  • 如果需要真实执行_get_metadata方法,只是修改默认参数,优先用方法1或方法3;
  • 如果不需要执行_get_metadata的真实逻辑,只需要验证调用或返回固定值,用方法2更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:22