使用pytest mocker fixture的assert_has_calls时断言失败,求排查
解决pytest mocker中assert_has_calls引发的AssertionError问题
嗨,这个问题其实是对assert_has_calls的用法理解出了小偏差!
你看,assert_has_calls本身不是一个返回布尔值的函数,它是mock库自带的断言方法:当调用序列符合预期时,它会安静地通过;一旦不符合,直接抛出AssertionError。而你现在把它放在assert语句里,相当于在断言None(因为这个方法没有返回值),这自然会触发assert None的失败啦。
把代码改成这样就正常了:
import os from mock import call def test_assert_(mocker): mocker.patch('os.remove') file_list = [f'file_{i}.txt' for i in range(20)] for f in file_list: os.remove(f) calls = [call(f) for f in file_list] # 直接调用assert_has_calls,不需要用assert包裹 os.remove.assert_has_calls(calls, any_order=True)
至于你手动用集合对比的方法能通过,是因为你直接断言两个集合的差异长度为0——这是一个有效的布尔判断,和assert_has_calls的内部逻辑类似,但写法上是正确的断言形式。
顺便提一句,mock库的这类断言方法(比如assert_called_once、assert_called_with)都是直接调用即可,不需要额外用assert包裹,它们内部已经实现了完整的断言逻辑,不符合条件时会主动抛出异常,pytest会自动捕获并标记测试失败。
内容的提问来源于stack exchange,提问作者Gregory Kuhn
相关产品推荐
相关产品推荐

