Насмешка над Python: исправление функции Python Pika "basic_publish" - PullRequest
0 голосов
/ 09 ноября 2018

Рассмотрим этот тестируемый код:

import pika

class MQ_Client():
    connection = None
    channel = None
    exchange_name="my_exchange"

    def connect(self):
        self.connection = pika.BlockingConnection(pika.ConnectionParameters(host="mq_server")

    def publish(self, message):

        properties = pika.BasicProperties(content_type='text/json', delivery_mode=1)

        if self.channel.basic_publish(exchange=self.exchange_name, routing_key='', properties=properties, body=message):
            log.info("Successfully published this message to exchange \"" + self.exchange_name + "\": " + message)
        else:
            log.error("Failed to publish message \"" + message + "\" to the exchange \"" + self.exchange_name + "\"!")
            raise Exception("Failed to publish message to the queue.")

То, что я хотел бы сделать, это исправить метод basic_publish Пики, чтобы вызвать исключение, и мог бы использовать некоторую помощь, чтобы выяснить, как это сделать. Это из моей последней попытки:

@mock.patch.object(pika.BlockingConnection, 'channel')
def test_that_mq_publish_problems_return_error(self, mocked_channel):
    with self.client as client:

        mocked_channel.basic_publish.side_effect = Exception()

        response = client.put("/api/users/bob", json="somedata")
        self.assertEqual(response.status_code, 500) 

Любые советы о том, как получить эту работу, будут оценены!

1 Ответ

0 голосов
/ 09 ноября 2018

Я получил это работает. Методы насмешливых экземпляров сильно отличаются от методов насмешливых классов После прочтения этой превосходной статьи я наконец понял, как это сделать, и оказалось, что все, что мне нужно для исправления метода basic_publish, - это немного изменить мой тест следующим образом:

@mock.patch('mq_client.pika.BlockingConnection', spec=pika.BlockingConnection)
def test_that_mq_publish_problems_return_error(self, mocked_connection):
    with self.client as client:
       mocked_connection.return_value.channel.return_value.basic_publish.return_value = False  
...