使用python和mock模拟ReviewBoard第三方库

时间:2016-08-13 17:02:13

标签: python mocking python-unittest review-board

我使用了ReviewBoard API库,今天我将代码移到了单独的类中,并希望通过一些测试来覆盖逻辑。我理解模拟和测试,但我对python和它的库显然没什么经验。这是真正代码的一部分:

g++

我想断言初始化以及调用get_root()方法。以下是我尝试实现这一目标的方法:

<!-- language: python -->
from rbtools.api.client import RBClient

class ReviewBoardWrapper():

    def __init__(self, url, username, password):
        self.url = url
        self.username = username
        self.password = password
        pass

    def Connect(self):
        self.client = RBClient(self.url, username=self.username, password=self.password)
        self.root = self.client.get_root()
        pass

这就是我坚持的错误:

<!-- language: python -->
import unittest
import mock

from module_base import ReviewBoardWrapper as rb

class RbTestCase(unittest.TestCase):

    @mock.patch('module_base.RBClient')
    @mock.patch('module_base.RBClient.get_root')
    def test_client_connect(self, mock_client, mock_method):
        rb_client = rb('', '', '')
        rb_client.Connect()
        self.assertTrue(mock_method.called)
        self.assertTrue(mock_client.called)

我做错了什么?我是否正确地模拟了本地副本&#34;进口图书馆?这个问题完全存在于不同的领域吗?

我也尝试过这样做:

$ python -m unittest module_base_tests
F.
======================================================================
FAIL: test_client_connect (module_base_tests.RbTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "module_base_tests.py", line 21, in test_client_connect
    self.assertTrue(mock_client.called)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

和/或这个:

@mock.patch('module_base.RBClient.__init__')

1 个答案:

答案 0 :(得分:1)

在帖子的示例中,模拟的顺序相反:

!ExistingLines.Contains(line)

客户端实际上被模拟为第二个参数,并且方法调用被模拟为第一个参数。

但是,要正确模拟客户端,您需要模拟客户端调用的返回值。模拟返回值并对返回值进行断言的示例如下:

test_client_connect(self, mock_client, mock_method)