Ho una funzione (foo
) che chiama un'altra funzione (bar
). Se invocando bar()
si alza un HttpError
, voglio gestirlo appositamente se il codice di stato è 404, altrimenti controrilancia.Mocking di una funzione per generare un'eccezione per testare un blocco tranne
Sto provando a scrivere alcuni test unitari attorno alla funzione foo
, prendendo in giro la chiamata a bar()
. Sfortunatamente, non sono in grado di ottenere la chiamata falsa a bar()
per generare un'eccezione che viene rilevata dal mio blocco except
.
Ecco il mio codice che illustra il mio problema:
import unittest
import mock
from apiclient.errors import HttpError
class FooTests(unittest.TestCase):
@mock.patch('my_tests.bar')
def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock):
barMock.return_value = True
result = foo()
self.assertTrue(result) # passes
@mock.patch('my_tests.bar')
def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found')
result = foo()
self.assertIsNone(result) # fails, test raises HttpError
@mock.patch('my_tests.bar')
def test_foo_shouldRaiseHttpError_whenBarRaiseHttpErrorNot404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 500}), 'error')
with self.assertRaises(HttpError): # passes
foo()
def foo():
try:
result = bar()
return result
except HttpError as error:
if error.resp.status == 404:
print '404 - %s' % error.message
return None
raise
def bar():
raise NotImplementedError()
ho seguito la Mock docs che dire che si dovrebbe impostare la side_effect
di un'istanza Mock
a una classe Exception
avere la funzione deriso sollevare l'errore.
Ho anche guardato un altro StackOverflow Q & correlato come, e sembra che sto facendo la stessa cosa che stanno facendo causa ed Eccezione da sollevare dal loro finto.
- https://stackoverflow.com/a/10310532/346561
- How to use Python Mock to raise an exception - but with Errno set to a given value
Perché l'impostazione del side_effect
di barMock
non causando l'atteso Exception
di essere sollevato? Se sto facendo qualcosa di strano, come dovrei andare a testare la logica nel mio blocco except
?
Sono abbastanza sicuro che la tua eccezione * sia * stata sollevata, ma non sono sicuro di come stai impostando il codice 'resp.status'. Da dove proviene 'HTTPError'? –
@MartijnPieters 'HttpError' è una classe definita in [Google' apiclient' lib] (https://developers.google.com/api-client-library/python/) che usiamo in GAE. È '__init__' è definito con i parametri' (resp, content) 'quindi stavo tentando di creare un'istanza di simulazione per la risposta, con il codice di stato appropriato specificato. –
Giusto, quindi è [questa classe] (https://github.com/google/google-api-python-client/blob/master/googleapiclient/errors.py#L35-L63); ma non è necessario all'utente 'return_value' allora; 'resp' non viene * chiamato *. –