при проверке, что шина сообщений будет вызывать функции, обозначенные в одной из ее глобальных переменных

< Сильный > messagebus.py

from . import handlers

class MessageBus:
    ...
    def handle_event(self, event: events.Event):
        handlers_ = EVENT_HANDLERS.get(type(event))
        ...

EVENT_HANDLERS = {
    events.BatchConfirmed: [handlers.send_remittance_to_connect, handlers.send_payment_information_to_vendor],
}

< Сильный > tests_handlers.py

from . import messagebus

def test_payment_batch_confirm_calls_expected_handlers(mocker):  # using pytest
    # GIVEN mocked event handlers to isolate tests
    send_remittance_to_connect_mock = \
        mocker.patch('src.disbursement.messagebus.handlers.send_remittance_to_connect')
    send_payment_information_to_vendor_mock = \
        mocker.patch('src.disbursement.handlers.send_payment_information_to_vendor')
    create_import_je_mock = mocker.patch('src.disbursement.handlers.create_import_je')

    # GIVEN a payment batch with a confirmation
    bus = messagebus.MessageBus()

    # WHEN invoking the cli to add the confirmation number
    bus.handle(commands.ConfirmPaymentBatch(
        reference=batch.reference, confirmation='PR-234848-493333333',
        payment_date=pd.Timestamp(year=2019, month=11, day=23)
    ))

    # THEN the expected handlers are called
    assert send_remittance_to_connect_mock.called  # this fails even though it is in the dictionary's list
    assert send_payment_information_to_vendor_mock.called
    assert create_import_je_mock.called

Тест выше не удается с этой ошибкой.

AssertionError: assert False
where False = <MagicMock name='send_remittance_to_connect' id='140228606012384'>.called

Я ожидал бы, что он потерпит неудачу при последнем утверждении, потому что исправленная функция обработчика находится в словаре EVENT_HANDLERS. Принимая отладчик к нему. patch работает (нижняя фиолетовая рамка). При взгляде на функцию глобальной переменной. Тем не менее, он не заполнен в словаре messagebus классов EVENT_HANDLER. Я думаю, что проблема в том, что оператор импорта в тестовом файле загружает глобальное значение словаря EVENT_HANDLERS перед тем, как функции будут смоделированы. Таким образом, они не заменяются, когда создается экземпляр сообщения. Кроме того, это единственный тест, который проводится, поэтому никаких других тестов нет.

enter image description here

Я смотрел, как обезьяна исправляет словарь EVENT_HANDLERS, но тест проверяет, будут ли эти обработчики, называемые исправлением обезьяны, из того, что я могу сказать, победить цель теста. Как я могу издеваться над этими функциями или как еще можно это проверить?

0
Daniel Butler