如何正确使用Pytest的assert_called_with?Mock调用断言失败排查
问题解决:正确编写send函数调用断言的测试用例
你的测试代码有两个核心问题,修正后即可正常运行:
错误原因与修正步骤
1. Patch路径不正确,导致Mock未生效
你之前使用@patch('pitest.decorat.send'),但该路径未正确指向do_smth实际调用的send函数,导致原send函数仍被执行(输出了key is a),而Mock对象从未被调用。
修正:如果测试代码和目标函数在同一个文件中,使用__name__ + '.send'作为patch路径,确保替换的是当前模块内的send函数:
@patch(__name__ + '.send')
2. 错误地用assert包裹assert_called_with
assert_called_with是MagicMock自带的断言方法,它会在调用不匹配时直接抛出AssertionError,成功时返回None。用assert包裹它相当于断言None,会直接导致测试失败。
修正:直接调用mo.assert_called_with(key='a'),无需额外的assert。
3. 移除多余的return_value=MagicMock()
Patch默认会自动创建一个MagicMock实例作为被替换函数的替身,额外指定return_value是多余的。
最终正确测试代码
from unittest.mock import patch def send(key=None): print('key is', key) def do_smth(): send(key='a') @patch(__name__ + '.send') def test_do_smth(mo): do_smth() mo.assert_called_with(key='a')
验证效果
运行该测试时,原send函数不会输出key is a(因为Mock已经替换了它),如果do_smth确实以key='a'调用了send,测试会通过;如果调用参数不匹配,会抛出明确的断言错误。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

