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

Python unittest中根据Mock对象返回不同布尔值的问题

解决unittest中Mock validate_schema返回指定布尔值的TypeError问题

需求与问题

我需要在Python unittest中Mock validate_schema()函数,让它在三次调用中前两次返回False,第三次返回True。待测试函数run_tests会遍历get_tests()返回的测试用例,将验证失败的用例加入failed_tests返回。但设置mock_validate_schema.side_effect = [False, False, True]时,触发了TypeError: 'bool' object is not iterable错误。

待测试代码

def run_tests():
    failed_tests = []
    for test in get_tests():
       if validate_schema(test):
           # 其他逻辑
       else:
           failed_tests.append(test)
    return failed_tests

def validate_schema(test):
    if test == foo:
        return True
    else:
        return False

错误原因分析

  1. Patch参数顺序颠倒:unittest的@patch装饰器是从下往上绑定参数的。你把@patch('app.test_extractor.get_tests')放在@patch('app.test_parser.validate_schema')上方,测试方法的参数顺序却写反了,导致mock_validate_schema被错误赋值为get_tests的Mock对象,给它设置side_effect时自然会触发类型错误。
  2. 变量名笔误:测试代码中写的mock_get_unit_tests.return_value是错误的,正确变量名应为mock_get_tests.return_value。

修复后的测试代码

import unittest

from unittest.mock import Mock, patch
from app.test_runner import run_tests

MOCK_TEST_CASE_ONE = Mock()
MOCK_TEST_CASE_TWO = Mock()
MOCK_TEST_CASE_THREE = Mock()

class TestRunTests(unittest.TestCase):
    # 调整patch顺序,validate_schema的patch在下方,对应第一个参数
    @patch('app.test_parser.validate_schema')
    @patch('app.test_extractor.get_tests')
    def test_two_fail_one_pass_test_on_validation(self, mock_get_tests, mock_validate_schema):
        # 修正笔误,用正确的变量名
        mock_get_tests.return_value = [MOCK_TEST_CASE_ONE, MOCK_TEST_CASE_TWO, MOCK_TEST_CASE_THREE]
        validation_results = [False, False, True]
        mock_validate_schema.side_effect = validation_results
        self.assertEqual(run_tests(), [MOCK_TEST_CASE_ONE, MOCK_TEST_CASE_TWO])


if __name__ == "__main__":
    unittest.main()

说明

  • side_effect接收列表时,会按函数调用顺序依次返回列表中的值,完全符合前两次失败、第三次成功的需求。
  • 确保patch的目标路径正确,要和run_tests中实际调用get_tests和validate_schema的模块路径一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:36:07