2016-08-13 80 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