2016-08-13 2 views
1

Ich benutze ReviewBoard API-Bibliothek und heute habe ich den Code in separate Klasse verschoben und wollte die Logik mit einigen Tests abdecken. Ich verstehe Mocks und Tests, aber ich bin eindeutig nicht viel Erfahrung mit dem Python und seinen Bibliotheken. Hier ist das Stück des echten Code:Mocking ReviewBoard Drittanbieter-Bibliothek mit Python und Mock

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

Und ich mag die Initialisierung sowie die GET_ROOT() Methoden aufgerufen werden behaupten. Hier ist, wie ich versuche, das zu erreichen:

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

Und hier ist der Fehler, den ich angesteckt:

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

Was mache ich falsch? Spotte ich die "lokale Kopie" importierter Bibliotheken richtig? Liegt das Problem vollständig in einem anderen Bereich?

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

und/oder dies:

Ich habe auch dies zu tun versucht, aus Ihrem Post

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

Wie unten durch Dangar erwähnt, neben der falschen Reihenfolge der Patch-Dekorateure die Lösung des Rückgabewert zu behaupten war: assertTrue (mock_method.return_value.called) – qlf00n

Antwort

1

Im Beispiel wird die Reihenfolge der spöttischen umgekehrt:

test_client_connect(self, mock_client, mock_method) 

Der Client wird tatsächlich als zweites Argument verspottet, und der Methodenaufruf wird als erstes Argument gemunkelt.

Um jedoch den Client richtig zu verspotten, möchten Sie den Rückgabewert des Clientanrufs vortäuschen. Ein Beispiel für den Rückgabewert spöttisch und eine Aussage über den Rückgabewert machen möchte folgend:

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

Rate mal was ... nach ca. 4 Tagen Googeln, Lesen und Spielen mit dem Code habe ich das Problem gefunden. Heute. Am Morgen. Ich wollte dich nur wissen lassen. Und ich sehe deine Antwort (: Danke, dass du dir Zeit genommen hast. Es war sicher das Problem, falsches Mocking zu behaupten. Ich hätte einen return_value mock machen sollen. Ja, die Reihenfolge ist umgekehrt, als ich versuchte zu verstehen was " Bottom-Up "bestellen bedeutet im Zusammenhang mit den Patchdekoratoren im Handbuch. Und ich habe es eindeutig falsch verstanden. – qlf00n