2016-08-13 55 views
1

我使用ReviewBoard API库,今天我将代码移动到单独的类,并希望用一些测试覆盖逻辑。我了解嘲笑和测试,但我显然没有太多的经验与Python和它的图书馆。这里是真正的代码块:嘲笑ReviewBoard第三方库使用Python和模拟

<!-- 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 

我想断言初始化以及调用get_root()方法。下面是我如何努力来实现这一目标:

<!-- 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) 

而且这里是我坚持的错误:

$ 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__') 

和/或本:

self.assertTrue(mock_client.__init__.called) 
+0

正如DanGar如下所述,补丁装饰的错误的顺序旁边的解决方案是断言的返回值: assertTrue(mock_method.return_value.called) – qlf00n

回答

1

在从您的文章的例子中,嘲讽的顺序是相反的:

test_client_connect(self, mock_client, mock_method) 

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

但是,要正确模拟客户端,您需要模拟客户端调用的返回值。讽刺的返回值,使在返回值的断言的一个例子是这样的:

class RbTestCase(unittest.TestCase):                                           

    @mock.patch('module_base.RBClient')                                          
    def test_client_connect(self, mock_client):                                        
     client = mock.MagicMock()                                           
     mock_client.return_value = client                                         
     rb_client = rb('', '', '')                                           
     rb_client.Connect()                                             
     self.assertTrue(client.get_root.called)                                        
     self.assertTrue(mock_client.called) 
+0

猜猜看,经过大约4天的搜索结果,阅读和玩我发现问题的代码。今天。在早上。只是想让你知道。我看到你的答案(:感谢你花时间,肯定是声称错误模拟的问题,我应该一直主张return_value模拟.. 是的,顺序是颠倒的,因为我试图了解什么是“自下而上“顺序意味着在手册中的修补程序装饰器的上下文中,而且我清楚地认为它是错误的。 – qlf00n