在 pytest 中模拟连接类

Oz1*_*123 6 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)
        ...
Run Code Online (Sandbox Code Playgroud)

在我的测试文件中,我执行了以下操作:

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")
Run Code Online (Sandbox Code Playgroud)

进入Aggregator.__init__调试器,我看到它connection仍然没有被修补为一个Mock实例:

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

我的问题是如何正确修补连接,以便我不需要rabbitmq 来运行测试?

Oz1*_*123 3

好的,文档说明如下:

patch() 的工作原理是(暂时)将一个名称指向的对象更改为另一个名称所指向的对象。可以有许多名称指向任何单个对象,因此为了使修补起作用,您必须确保修补被测试系统使用的名称。

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

因此,解决方案:

@patch('aggregator.aggregator.Connection')
def test_on_request(mock_connect):
    agg = Aggregator('localhost')
Run Code Online (Sandbox Code Playgroud)