2017-08-08 3 views
0

Ich habe eine Funktion unten und will einen Unittest schreiben mein Code zu überprüfen, ob fängt Connection Mock-BibliothekWie testen Sie, dass eine Funktion eine Ausnahme auslöst?

def get_foo(): 
    try: 
     return requests.get("http://www.bongani.com") 
    except requests.exceptions.ConnectionError: 
     print("Error") 

Was ich habe:

import unittest 
import mock 


class MyTestCase(unittest.TestCase): 
    @mock.patch('requests.get') 
    def test_foo(self, mock_requests_get): 
     mock_requests_get.side_effect = requests.exceptions.ConnectionError() 
     with self.assertRaises(requests.exceptions.ConnectionError): 
      get_foo() 

if __name__ == '__main__': 
    unittest.main() 

ich diesen Fehler:

Traceback (most recent call last): 
File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1305 , in patched 
    return func(*args, **keywargs) 
File "<ipython-input-24-15266e4f708a>", , in test_foo 
    get_foo() 
AssertionError: ConnectionError not raised 

Ich möchte die return requests.get("http://www.bongani.com") Linie verspotten, so dass es eine Ausnahme auslöst, wenn

aufgerufen wird

Antwort

0

Die Ausnahme wird nicht durchgebrannt (d. H. Sie wird unterdrückt), weil Sie sie abgefangen haben und sie dann nicht erneut erhöht haben. Im Gegenzug werden Ihre Komponententests fehlschlagen, weil Sie testen, dass Ihre Funktion diese Ausnahme auslöst, während sie unterdrückt wird.

Je nachdem, welches Verhalten gewünscht wird, ändern Sie entweder die Funktion oder den Komponententest der Funktion.

die Tests Unter der Annahme richtig, dann müssen Sie Ihre Funktion die Ausnahme so re-raise:

def get_foo(): 
    try: 
     return requests.get("http://www.bongani.com") 
    except requests.exceptions.ConnectionError: 
     print("Error") 
     raise # <---------------- add this line 

Ein weiteres Szenario ist die Funktion richtig und die Tests sind falsch. Sie reparieren Ihre Tests so, dass sie wie folgt aussehen:

class MyTestCase(unittest.TestCase): 
    @mock.patch('requests.get') 
    def test_foo(self, mock_requests_get): 
     mock_requests_get.side_effect = requests.exceptions.ConnectionError() 
     self.assertIsNone(get_foo()) # <----- no more assertRaises 
+0

Ich ging mit Szenario 2. Danke, dass Sie mich meinen Fehler sehen lassen. –

0

Stellen Sie sicher, den richtigen Pfad

@mock.patch('path.to.get_foo.requests.get') 

Du hast nicht die Ausnahme instanziiert wollen patchen.

+0

Immer noch die gleichen Ergebnisse. –

Verwandte Themen