Макет класса соединения в 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 ответ:
ОК, в документах указано следующее:
Patch() работает путем (временного) изменения объекта, на который указывает имя чтобы с другой. Может быть много имен, указывающих на любое индивидуальный объект, поэтому для того чтобы латать работать вы должны обеспечить что вы исправьте имя, используемое тестируемой системой.
Основной принцип заключается в том, что вы исправляете место, где объект просматривается, это не обязательно то же самое место, где оно определено. Один пара примеров будет помогите прояснить это.
Следовательно, решение:
@patch('aggregator.aggregator.Connection') def test_on_request(mock_connect): agg = Aggregator('localhost')