Макет класса соединения в pytest


У меня есть класс, который наследует от kombu.ConsumerProducerMixin, который я хотел бы протестировать без фактического запуска службы rabbitmq.

class Aggregator(ConsumerProducerMixin):

    def __init__(self, broker_url):
        exchange_name = 'chargers'
        self.status = 0
        self.connection = Connection(broker_url)
        ...

В моем тестовом файле я сделал следующее:

from unittest.mock import Mock, patch

from aggregator import Aggregator

@patch('kombu.connection.Connection')
def test_on_request(conn_mock):

    agg = Aggregator('localhost')
    m = Message("", {"action": "start"}, content_type="application/json")

Входя в Aggregator.__init__ с отладчиком, я вижу, что connection все еще не исправлен, чтобы быть экземпляром Mock:

(Pdb) self.connection
<Connection: amqp://guest:**@localhost:5672// at 0x7fc8b7f636d8>
(Pdb) Connection
<class 'kombu.connection.Connection'>

Мой вопрос заключается в том, как мне правильно исправить соединение, чтобы мне не нужно было rabbitmq для выполнения тестов?

1 3

1 ответ:

ОК, в документах указано следующее:

Patch() работает путем (временного) изменения объекта, на который указывает имя чтобы с другой. Может быть много имен, указывающих на любое индивидуальный объект, поэтому для того чтобы латать работать вы должны обеспечить что вы исправьте имя, используемое тестируемой системой.

Основной принцип заключается в том, что вы исправляете место, где объект просматривается, это не обязательно то же самое место, где оно определено. Один пара примеров будет помогите прояснить это.

Следовательно, решение:

@patch('aggregator.aggregator.Connection')
def test_on_request(mock_connect):
    agg = Aggregator('localhost')