如何在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
相关产品推荐
相关产品推荐

