6

我有一个继承的类,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 来运行测试?

4

1 回答 1

3

好的,文档说明如下:

patch() 通过(临时)将名称指向的对象更改为另一个对象。可以有许多名称指向任何单个对象,因此要使修补工作正常,您必须确保修补被测系统使用的名称。

基本原则是您在查找对象的位置进行修补,该位置不一定与定义对象的位置相同。几个例子将有助于澄清这一点。

因此,解决方案:

@patch('aggregator.aggregator.Connection')
def test_on_request(mock_connect):
    agg = Aggregator('localhost')
于 2017-03-08T10:44:21.260 回答