使用 pytest-mock 检查调用顺序

Ale*_*mov 5 python mocking pytest pytest-mock

在下面显示的代码片段中,我想测试函数中的函数调用顺序run(),即,在调用之后f_3调用:f_2f_1

class TestMock:

    def f_1(self) -> None:
        pass

    def f_2(self) -> None:
        pass

    def f_3(self) -> None:
        pass

    def run(self) -> None:
        self.f_1()
        self.f_2()
        self.f_3()
Run Code Online (Sandbox Code Playgroud)

有什么方法可以使用 来做到这一点吗pytest-mock?我尝试在测试文件中模拟f_1f_2和函数并使用with ,但是没有成功。f_3assert_has_callsany_order=False

预先感谢您的任何帮助或提示!

最好的,阿列克谢

wim*_*wim 3

您在正确的轨道上any_order=False,您只需要了解该attach_mock功能:

import yourmodule

def test_something(mocker):
    mock = mocker.MagicMock()
    mock.attach_mock(mocker.patch("yourmodule.TestMock.f_1"), "f_1")
    mock.attach_mock(mocker.patch("yourmodule.TestMock.f_2"), "f_2")
    mock.attach_mock(mocker.patch("yourmodule.TestMock.f_3"), "f_3")
    yourinstance = yourmodule.TestMock()
    yourinstance.run()
    mock.assert_has_calls(
        [
            mocker.call.f_1(),
            mocker.call.f_2(),
            mocker.call.f_3(),
        ],
        any_order=False,
    )
Run Code Online (Sandbox Code Playgroud)