2016-08-13 12 views
1

私はReviewBoard APIライブラリを使用していますが、今日は別のクラスにコードを移動し、いくつかのテストでロジックをカバーしたかったのです。私はモックとテストを理解していますが、私は明らかにPythonとそれがライブラリです。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

:戻り値をあざけると戻り値のアサーションを行う例は、次のことを希望 assertTrue(mock_method.return_value.called) – qlf00n

答えて

1

を、モックの順番が逆になる:

test_client_connect(self, mock_client, mock_method) 

クライアントは実際には第2引数としてモックされており、メソッド呼び出しは第1引数として偽装されています。

ただし、クライアントを適切にモックするには、クライアント呼び出しの戻り値をモックする必要があります。以下DanGarで述べたように解決策は、戻り値を主張したパッチのデコレータの誤った順序の横に、

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

関連する問題