调用列表不完整的Python模拟调用顺序

2024-09-30 22:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是找出一个对象的函数是否在另一个对象的另一个函数之前被调用

class A:
    def foo( self ):
       ...

    def foo2( self ):
       ...

class B:
    def goo( self ):
       ...

class C:
    def func( self, a: A, b: B ):
       a.foo()
       a.foo2()
       b.goo()

通过我的单元测试,我想知道a.foo()是否在b.goo()之前被调用。 我已经在下面的代码中尝试过了,但是很明显,它不起作用,因为中间有一个调用a.foo2()

class SomeTests( unittest.TestCase ):
    def test_callOrder( self ):
        aMock = Mock()
        bMock = Mock()
        topMock = Mock()
        topMock.attach_mock( aMock, 'a' )
        topMock.attach_mock( bMock, 'b' )

        c = C()
        c.func( aMock, bMock )    

        expectedCalls = []
        expectedCalls.append( call.a.foo() )
        expectedCalls.append( call.b.goo() )
        topMock.assert_has_calls( expectedCalls, any_order=False )

我怎样才能忽略对a.foo2()的调用,而只将断言集中在a.foo()b.goo()上呢


Tags: 对象函数selffoodefmockclassfunc
1条回答
网友
1楼 · 发布于 2024-09-30 22:28:37

由于没有对此进行具体检查,您必须执行两个测试:首先检查两个函数是否都被调用,然后检查它们是否按正确的顺序被调用:

class SomeTests(unittest.TestCase):
    def test_callOrder(self):
        ...

        c = C()
        c.func(aMock, bMock)

        expectedCalls = [call.a.foo(), call.b.goo()]
        topMock.assert_has_calls(expectedCalls, any_order=True)
        self.assertGreater(topMock.mock_calls.index(call.b.goo()),
                           topMock.mock_calls.index(call.a.foo()))

如果函数被调用,那么无论顺序如何,第一次调用(assert_has_callsany_order=True)都将成功,并且其间的其他调用也是如此。第二个检查依赖于mock_calls属性,如果没有适当的便利函数,该属性允许进行更多检查

相关问题 更多 >