0

testen Neu zu verwenden Mock. auf Python 2.7.13.Python 2.7 - Kann nicht herausfinden, wie man mit Mock

Ich baue ein Wrapper um diese Bibliothek
https://github.com/sendgrid/sendgrid-python/blob/master/sendgrid/sendgrid.py

, die diese Bibliothek wiederum für jeden REST verbraucht ruft
https://github.com/sendgrid/python-http-client/blob/master/python_http_client/client.py

Mein Testcode wie

class TestSendgridUtils(unittest.TestCase): 
    def setUp(self): 
     self.sgsu = SubUser(api_key=RANDOM_API_KEY, hippo_user=RANDOM_USER_OBJ) 

    @patch('sendgrid.SendGridAPIClient') 
    @patch('python_http_client.Client') 
    def test_create(self, sgc_mock, http_client_mock): 
     self.sgsu.create() 
     expected_data = { 
      'email' : self.sgsu.sg_username 
     } 
     print http_client_mock.call_list() 
     sgc_mock.client.assert_called_with(request_body=expected_data) 

I sieht Ich versuche im Grunde, die zugrunde liegende Bibliothek zu verspotten, die die HTTP-Aufrufe macht. Meine Tests sind nur um sicherzustellen, dass ich die richtigen Parameter an das Modul sendgrid übergebe.

Gerade jetzt, wenn ich die Tests ausführen, werden HTTP-Anfragen immer noch gemacht, was bedeutet, dass ich die beabsichtigten Bibliotheken nicht erfolgreich verspottete.

Lesen der Mock-Dokumentation Ich verstehe, dass Patch nur funktioniert, wo ich die zugrunde liegende Klasse instanziieren. Aber das müsste in setUp() sein, was bedeuten würde, dass meine Mocks in meinen Testfällen nicht verfügbar wären?

Als Ergebnis kann ich nicht herausfinden, was ist die beste Praxis um, wie ich Mock in diesem Fall verwende. Ich kann auch nicht herausfinden, wenn ich nur die ‚sendgrid.SendGridAPIClient‘ verspotten kann oder wenn ich verspotten müssen ‚python_http_client.Client‘

Antwort

0

Sie sollten patch Objekte in dem Modul, wo Sie sie verwenden (zB in app.py), nicht wo sie definiert sind.
So Ihre Anrufe zu patch sollte wie folgt aussehen:

@patch('app.sendgrid.SendGridAPIClient') 

nicht:

@patch('sendgrid.SendGridAPIClient') 

Auch Ihre Bestellung von Mocks ist nicht übereinstimmen:

@patch('sendgrid.SendGridAPIClient') 
@patch('python_http_client.Client') 
def test_create(self, sgc_mock, http_client_mock): 

Sie müssen entweder Schalter ruft patch oder Switch-Methode Argumente, weil jetzt @patch('sendgrid.SendGridAPIClient') entsprichtentspricht 10 und @patch('python_http_client.Client') bis sgc_mock.

Verwandte Themen