使用pytest mocker忽略assert_has_calls中的链式调用

问题描述 投票:0回答:2

当使用来自mockerpytest-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本身的顺序。

python python-3.x mocking pytest
2个回答
2
投票

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

0
投票

使用assert_any_call

m.run.assert_any_call(['foo'])
m.run.assert_any_call(['bar'])
© www.soinside.com 2019 - 2024. All rights reserved.