【问题标题】:How to write a unit test with mockito in Python如何在 Python 中使用 mockito 编写单元测试
【发布时间】:2015-11-23 10:40:39
【问题描述】:

我是 Python 的新手,我对 Python 中的 mockito 有疑问。

我的生产代码如下所示:

from stompest.config import StompConfig
from stompest.sync import Stomp


class Connector:
    def sendMessage(self):
        message = {'message'}
        dest = '/queue/foo'

    def _send(self, message='', dest=''):
        config = StompConfig(uri="tcp://localhost:61613")
        client = Stomp(config)
        client.connect()
        client.send(body=message, destination=dest,
                    headers='')
        client.disconnect()

如您所见,我想使用 Stomp 协议发送消息。在我的测试中,我想测试一下,当我从 Connector 类调用发送方法时,来自 Stompest 库的发送方法只会被调用一次。

我的单元测试如下:

from Connector import Connector

import unittest
from mockito import *
import stompest
from stompest.config import StompConfig
from stompest.sync import Stomp


class test_Connector(unittest.TestCase):
    def test_shouldInvokeConnectMethod(self):
        stomp_config = StompConfig(uri="tcp://localhost:61613")
        mock_stomp = mock(Stomp(stomp_config))

        connector = Connector()
        connector.sendMessage()
        verify(mock_stomp, times=1).connect()

当我在调试模式下运行测试时,我看到实例 connect() 的方法被调用并且方法也被发送,但作为测试的结果,我得到:

Failure
Traceback (most recent call last):
  File "C:\development\systemtest_repo\robot_libraries\test_Connector.py", line 16, in test_shouldInvokeConnectMethod
    verify(mock_stomp, times=1).connect()
  File "C:\Python27\lib\site-packages\mockito\invocation.py", line 111, in __call__
    verification.verify(self, len(matched_invocations))
  File "C:\Python27\lib\site-packages\mockito\verification.py", line 63, in verify
    raise VerificationError("\nWanted but not invoked: %s" % (invocation))
VerificationError: 
Wanted but not invoked: connect()

我做错了什么?

【问题讨论】:

    标签: python python-2.7 unit-testing


    【解决方案1】:

    您实际上并没有在模拟对象上调用connect 方法——您只需检查它是否被调用。这也是错误所说的Wanted but not invoked: connect()。也许在调用verify 之前添加对mock_stomp.connect() 的调用将解决此问题:

    mock_stomp = mock(Stomp(stomp_config))
    
    # call the connect method first...
    mock_stomp.connect()
    
    connector = Connector()
    connector.sendMessage()
    
    # ...then check it was called
    verify(mock_stomp, times=1).connect()
    

    如果您尝试检查模拟是否从Connector 调用,您可能至少需要通过依赖注入传入mock_stomp 对象。例如

    class Connector:
      def __init__(self, stomp):
       self.stomp = stomp
    
      def sendMessage(self, msg):
        self.stomp.connect()
        # etc ...
    

    在你的测试中

    mock_stomp = mock(Stomp(stomp_config))
    connector = Connector(mock_stomp)
    connector.sendMessage()
    
    verify(mock_stomp, times=1).connect()
    

    否则,我看不出connect() 方法可以如何在您断言所基于的mock_stomp 的同一实例上调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2012-09-09
      • 2010-10-02
      • 2020-10-13
      相关资源
      最近更新 更多