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
错误原因分析
- Patch参数顺序颠倒:unittest的
@patch装饰器是从下往上绑定参数的。你把@patch('app.test_extractor.get_tests')放在@patch('app.test_parser.validate_schema')上方,测试方法的参数顺序却写反了,导致mock_validate_schema被错误赋值为get_tests的Mock对象,给它设置side_effect时自然会触发类型错误。 - 变量名笔误:测试代码中写的
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
相关产品推荐
相关产品推荐

