Ho una funzione ( foo
) che chiama un'altra funzione ( bar
). Se invocare bar()
solleva un HttpError
, voglio gestirlo specialmente se il codice di stato è 404, altrimenti rilancia di nuovo.
Sto cercando di scrivere alcuni unit test attorno a questa foo
funzione, deridendo la chiamata a bar()
. Sfortunatamente, non riesco a ottenere la chiamata derisa a bar()
per sollevare un'eccezione che viene catturata dal mio except
blocco.
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 i documenti Mock che dicono che dovresti impostare il side_effect
di Mock
un'istanza su una Exception
classe per fare in modo che la funzione derisa sollevi l'errore.
Ho anche esaminato alcune altre domande e risposte relative a StackOverflow, e sembra che io stia facendo la stessa cosa che stanno facendo per causare ed Eccezione per essere sollevata dalla loro simulazione.
- https://stackoverflow.com/a/10310532/346561
- Come usare Python Mock per sollevare un'eccezione, ma con Errno impostato su un dato valore
Perché l'impostazione side_effect
di barMock
non provoca l'aumento del previsto Exception
? Se sto facendo qualcosa di strano, come devo fare per testare la logica nel mio except
blocco?
HttpError
è una classe definita in di Google apiclient
lib che usiamo in GAE. È __init__
definito con i parametri, (resp, content)
quindi stavo tentando di creare un'istanza fittizia per la risposta, con il codice di stato appropriato specificato.
return_value
utilizzi; resp
non viene chiamato .
HttpError
e invece ho provato a utilizzare solo Exception
un'istanza normale . Funziona perfettamente. Ciò significa che deve avere qualcosa a che fare con il modo in cui sto configurando l' HttpError
istanza, probabilmente correlato a come sto creando Mock
un'istanza per la risposta.
resp.status
codice lì. Da doveHTTPError
viene?