python - 함수 - 파이썬 숫자를 리스트로



여러 모의 객체에서 호출 순서 확인 (1)

Mock 매니저를 정의하고 attach_mock() 통해 attach_mock() 을 첨부하십시오. 그런 다음 mock_calls 확인하십시오.

@patch('module.a')
@patch('module.b')
@patch('module.c')
def test_main_routine(c, b, a):
    manager = Mock()
    manager.attach_mock(a, 'a')
    manager.attach_mock(b, 'b')
    manager.attach_mock(c, 'c')

    module.main_routine()

    expected_calls = [call.a('a'), call.b('b'), call.c('c')]
    assert manager.mock_calls == expected_calls

그냥 작동하는지 테스트하려면 main_routine() 함수에서 함수 호출 순서를 변경하여 AssertionError 가 발생하는지 확인하십시오.

호출 추적 순서 및 자세한 호출 어설 션 에서 더 많은 예제를 참조하십시오.

희망이 도움이됩니다.

호출 순서를 테스트하려고하는 세 가지 함수가 있습니다.

module.py 모듈에 다음과 같은 코드가 있다고 가정 해 보겠습니다.

# module.py    

def a(*args):
    # do the first thing

def b(*args):
    # do a second thing

def c(*args):
    # do a third thing


def main_routine():
    a_args = ('a')
    b_args = ('b')
    c_args = ('c')

    a(*a_args)
    b(*b_args)
    c(*c_args)

나는 b가 a 다음에, c보다 앞에 있는지 확인하고 싶다. 따라서 a, b 및 c 각각에 대한 가짜를 얻는 것은 쉽습니다.

# tests.py

@mock.patch('module.a')
@mock.patch('module.b')
@mock.patch('module.c')
def test_main_routine(c_mock, b_mock, a_mock):
    # test all the things here

각 개인 모의 객체가 호출되는지 확인하는 것도 쉽습니다. 상대방과의 상대적인 순서를 어떻게 확인합니까?

call_args_list 는 각 모의 용으로 별도로 관리되므로 작동하지 않습니다.

부작용을 사용하여 각 호출을 기록하려고 시도했습니다.

calls = []
def register_call(*args):
    calls.append(mock.call(*args))
    return mock.DEFAULT

a_mock.side_effect = register_call
b_mock.side_effect = register_call
c_mock.side_effect = register_call

그러나 이것은 단지 저에게 가짜가 호출 된 args를 제공하지만, 호출이 만들어진 실제 모의는 제공하지 않습니다. 나는 조금 더 많은 논리를 추가 할 수있다.

# tests.py
from functools import partial

def register_call(*args, **kwargs):
    calls.append(kwargs.pop('caller', None), mock.call(*args, **kwargs))
    return mock.DEFAULT

a_mock.side_effect = partial(register_call, caller='a')
b_mock.side_effect = partial(register_call, caller='b')
c_mock.side_effect = partial(register_call, caller='c')

그리고 그 일을 끝내는 것 같습니다 ... 더 좋은 방법이 있습니까? 이미 API에서 누락 된 부분이있는 것처럼 느껴집니다.





python-mock