Python 忽略assert\u has\u调用中的链接调用,使用pytest mocker
使用中的Python 忽略assert\u has\u调用中的链接调用,使用pytest mocker,python,python-3.x,mocking,pytest,Python,Python 3.x,Mocking,Pytest,使用中的mockerfrom时,如何使用has\u 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 = subproc
mocker
from时,如何使用has\u 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'])
。我不关心对它返回的任何东西的调用,但我关心对运行
本身的调用顺序。将any\u order=True
添加到您的assert\u has\u calls
调用中,如下所示:
m.run.assert_has_calls([
mock.call(['foo']),
mock.call(['bar']),
], any_order=True)
原因是,assert\u has\u calls
似乎在基于文档()的模拟上使用了mock\u calls
属性:
记录对mock对象、其方法、魔术方法和返回值mock的所有调用
然而,对于assert\u has\u调用,这不是一个精确的匹配问题,只是排序失败了
编辑:由于订单很重要,请使用调用参数列表
。像这样:
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
使用:
感谢您给我指出mock_calls
,这就解释了这种行为。但是,any_order
对我来说都不起作用:>我只想检查一下我是否调用了subprocess.run(['foo']),然后又调用了subprocess.run(['bar']),我只想在这里指出,调用参数列表才是真正的答案,应该被接受(但也可能是答案本身应该被编辑以突出答案的这一部分)。assert\u any\u call
不允许我检查顺序。>>我只想检查我是否调用了subprocess.run(['foo']),然后调用了subprocess.run(['bar']).两个答案似乎都忽略了这一点,因此我将对问题进行编辑以使其更清楚。
m.run.assert_any_call(['foo'])
m.run.assert_any_call(['bar'])