Python-gitlab方法返回值Mock失败,返回MagicMock对象求助
解决python-gitlab链式调用的Mock问题
你的测试代码有两个核心问题导致Mock失效:
1. Patch装饰器的参数顺序错误
@patch装饰器是从下往上生效的,测试函数的参数顺序必须和装饰器顺序相反。你当前的参数顺序mockGitlab, mockGroup, mockList完全颠倒,正确顺序应为mockList, mockGroup, mockGitlab。
2. 链式调用的Mock未正确串联
gl.groups.get(1).iterations.list()是多层链式调用,必须确保每一层调用都返回对应的Mock对象,让最终的list()方法指向你patch的mockList。
修正后的完整代码
import gitlab from unittest.mock import patch def get_all_iters(): # 补充private_token参数占位符(原代码遗漏赋值) gl = gitlab.Gitlab(url='test_url', private_token='dummy_token') result = gl.groups.get(1).iterations.list() return result # Patch顺序从下到上,参数顺序对应从左到右为最后一个patch的mock @patch('gitlab.Gitlab') @patch('gitlab.v4.objects.GroupManager') @patch('gitlab.mixins.ListMixin.list') def test_my_code(mockList, mockGroup, mockGitlab): # 设置目标方法的返回值 mockList.return_value = ['a', 'b'] # 串联链式调用的Mock对象 # 让Gitlab实例的groups属性指向GroupManager的Mock实例 mock_gitlab_instance = mockGitlab.return_value mock_gitlab_instance.groups = mockGroup.return_value # 让groups.get(1)返回包含iterations属性的Mock mock_group = mockGroup.return_value.get.return_value # 让iterations的list方法指向我们patch的mockList mock_group.iterations.list = mockList # 执行测试 result = get_all_iters() print(result) # 输出预期的['a', 'b']
简化写法(用configure_mock)
如果觉得手动串联繁琐,可以用configure_mock一次性构造完整链式调用的Mock结构:
@patch('gitlab.Gitlab') def test_my_code_simpler(mockGitlab): # 直接配置多层链式调用的返回逻辑 mockGitlab.return_value.configure_mock( groups=mockGitlab.return_value.groups.configure_mock( get=lambda _: mockGitlab.return_value.groups.get.return_value.configure_mock( iterations=mockGitlab.return_value.groups.get.return_value.iterations.configure_mock( list=lambda: ['a', 'b'] ) ) ) ) result = get_all_iters() print(result) # 输出['a', 'b']
修改后即可正确Mockiterations.list()的返回值,不再返回MagicMock对象。
内容的提问来源于stack exchange,提问作者Song Tùng
相关产品推荐
相关产品推荐

