Başka bir işlevi ( foo) çağıran bir işlevim ( bar) var. Bir bar()yükseltirse HttpError, durum kodu 404 ise özel olarak ele almak, aksi takdirde yeniden yükseltmek istiyorum.
fooÇağrıyı alay ederek, bu işlev etrafında bazı birim testleri yazmaya çalışıyorum bar(). Maalesef, bloğum bar()tarafından yakalanan bir İstisna oluşturmak için alay edilen çağrıyı alamıyorum except.
İşte benim problemimi gösteren kodum:
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()
Hatayı alay işlevinin yükseltmesini sağlamak için bir örneği bir sınıfa ayarlamanız gerektiğini söyleyen Mock belgelerini takip ettim .side_effectMockException
Ayrıca, ilgili diğer bazı StackOverflow Soru ve Cevaplarına da baktım ve görünüşe göre onların alayları tarafından ortaya çıkmasına neden olmak için yaptıkları şeyi ve İstisna'yı yapıyorum.
- https://stackoverflow.com/a/10310532/346561
- Bir istisna oluşturmak için Python Mock nasıl kullanılır - ancak Errno belirli bir değere ayarlanmış
Neden ayarlıyor side_effectarasında barMockbeklenen yol açmayan Exceptionyetiştirilmek üzere? Garip bir şey yapıyorsam, bloğumda mantığı test etmeye nasıl devam etmeliyim except?
HttpErrortanımlanan bir sınıftır Google'ın apiclientlib biz GAE kullandığımız. O oluyor __init__parametreleri içeren tanımlanır (resp, content)Ben tepki için sahte bir örneğini oluşturmaya çalışırken bu yüzden uygun durum kodu belirtilmiş olan,.
return_valueo zaman kullanıcıya gerek yok ; respvarlık değildir denir .
HttpErrordenedim ve bunun yerine normal bir Exceptionörnek kullanmayı denedim . Bu mükemmel çalışıyor. Bu, HttpErrorörneği nasıl yapılandırdığımla ilgili olması gerektiği anlamına gelir , muhtemelen Mockyanıt için nasıl örnek oluşturduğumla ilgilidir .
resp.statusorada kodu. NeredenHTTPErrorgeliyor?