如何用unittest Mock跳过函数内代码行,复用变量值替代返回值
如何在不修改原函数参数的情况下跳过指定代码行进行单元测试?
你完全可以通过Mock工具实现这个需求,核心思路是让store_and_return_foo()返回第一行compute_foo(inputs)生成的foo值,这样第二行的赋值操作不会改变foo的内容,等价于跳过了该行的实际逻辑。以下是具体实现方案:
方案一:Mock依赖函数,控制返回值
如果你想完全控制测试中的数据,可以同时Mockcompute_foo和store_and_return_foo,让它们返回相同的预期值:
from unittest.mock import patch import my_module def test_function_to_test(): test_inputs = "sample_input" expected_foo = "mock_foo_result" # Mock compute_foo,返回预期值 with patch("my_module.compute_foo", return_value=expected_foo): # 关键:让store_and_return_foo返回和compute_foo一样的值 with patch("my_module.store_and_return_foo", return_value=expected_foo): # Mock do_work,验证它是否收到正确的参数 with patch("my_module.do_work") as mock_do_work: my_module.function_to_test(test_inputs) # 验证依赖函数的调用逻辑 my_module.compute_foo.assert_called_once_with(test_inputs) mock_do_work.assert_called_once_with(expected_foo)
方案二:保留compute_foo实际逻辑,仅Mockstore_and_return_foo
如果想使用compute_foo的真实业务逻辑生成foo,只需先获取该值,再让store_and_return_foo返回它即可:
from unittest.mock import patch import my_module def test_function_to_test_with_real_compute(): test_inputs = "sample_input" # 先通过真实逻辑获取foo值 real_foo = my_module.compute_foo(test_inputs) # Mock store_and_return_foo,返回真实的foo值 with patch("my_module.store_and_return_foo", return_value=real_foo): with patch("my_module.do_work") as mock_do_work: my_module.function_to_test(test_inputs) # 验证do_work确实收到了compute_foo生成的foo mock_do_work.assert_called_once_with(real_foo)
这两种方式都不需要修改原函数的代码,也不需要添加额外的参数,完全通过测试层的Mock来实现跳过指定行的效果,既保留了生产代码的完整性,又满足了测试需求。
内容的提问来源于stack exchange,提问作者nir
相关产品推荐
相关产品推荐

