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'])