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 来运行测试?
好的,文档说明如下:
patch() 的工作原理是(暂时)将一个名称指向的对象更改为另一个名称所指向的对象。可以有许多名称指向任何单个对象,因此为了使修补起作用,您必须确保修补被测试系统使用的名称。
基本原则是在查找对象的位置进行修补,该位置不一定与其定义的位置相同。几个例子将有助于澄清这一点。
因此,解决方案:
@patch('aggregator.aggregator.Connection')
def test_on_request(mock_connect):
agg = Aggregator('localhost')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |