при проверке, что шина сообщений будет вызывать функции, обозначенные в одной из ее глобальных переменных
< Сильный > 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
перед тем, как функции будут смоделированы. Таким образом, они не заменяются, когда создается экземпляр сообщения. Кроме того, это единственный тест, который проводится, поэтому никаких других тестов нет.
Я смотрел, как обезьяна исправляет словарь EVENT_HANDLERS
, но тест проверяет, будут ли эти обработчики, называемые исправлением обезьяны, из того, что я могу сказать, победить цель теста. Как я могу издеваться над этими функциями или как еще можно это проверить?
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.