当使用来自mocker
的pytest-mock
时,如何在不检查对该方法的返回值的所有调用的情况下使用has_calls
来检查对特定方法的调用?
例如:
import subprocess
from unittest import mock
def test_foo(mocker):
m = mocker.patch('test_main.subprocess')
r1 = subprocess.run(['foo'])
r1.check_returncode()
r2 = subprocess.run(['bar'])
r2.check_returncode()
m.run.assert_has_calls([
mock.call(['foo']),
mock.call(['bar']),
])
失败:
E AssertionError: Calls not found.
E Expected: [call(['foo']), call(['bar'])]
E Actual: [call(['foo']),
E call().check_returncode(),
E call(['bar']),
E call().check_returncode()]
为什么还包括对返回值的调用?我只是想检查一下我打电话给subprocess.run(['foo'])
然后打电话给subprocess.run(['bar'])
。我不关心对它返回的任何内容的调用,但我确实关心调用run
本身的顺序。
将any_order=True
添加到您的assert_has_calls
电话中,如下所示:
m.run.assert_has_calls([
mock.call(['foo']),
mock.call(['bar']),
], any_order=True)
原因是,看起来assert_has_calls
在基于文档(mock_calls
)的模拟上使用https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.mock_calls属性:
记录对模拟对象,方法,魔术方法和返回值模拟的所有调用。
但是,使用assert_has_calls
,它不是一个完全匹配的问题,它只是失败的排序。
编辑:由于订单很重要,请使用call_args_list
。像这样:
def test_foo(mocker):
m = mocker.patch('subprocess_test.subprocess')
r1 = subprocess.run(['foo'])
r1.check_returncode()
r2 = subprocess.run(['bar'])
r2.check_returncode()
assert [mock.call(['foo']), mock.call(['bar'])] == m.run.call_args_list
m.run.assert_any_call(['foo'])
m.run.assert_any_call(['bar'])