2017-03-08 78 views
3

我有一个继承kombu.ConsumerProducerMixin的类,我希望在没有运行实际的rabbitmq服务的情况下进行测试。在pytest中模拟一个连接类

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来运行测试?

回答

2

确定,docs状态如下:

补丁()的工作方式(暂时)改变对象的名称点 以另外一个人。可以有许多名称指向任何对象,因此为了使修补工作正常,您必须确保 修补了被测系统使用的名称。

基本原理是,你修补了一个物体被查找的位置,它不一定与它定义的位置相同。几个例子将有助于澄清这一点。

因此,该解决方案:

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