在pytest中模拟连接类

时间:2017-03-08 10:21:22

标签: python unit-testing mocking rabbitmq kombu

我有一个继承自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 个答案:

答案 0 :(得分:2)

好的,docs说明以下内容:

  

patch()通过(临时)更改名称所指向的对象来工作   与另一个人。可以有许多名称指向任何名称   个别对象,所以为了修补工作,你必须确保你   修补被测系统使用的名称。

     

基本原则是你修剪一个对象的位置,   它不一定与定义的地方相同。一个   几个例子将有助于澄清这一点。

因此,解决方案:

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