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_effect
Mock
Exception
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_effect
arasında barMock
beklenen yol açmayan Exception
yetiştirilmek üzere? Garip bir şey yapıyorsam, bloğumda mantığı test etmeye nasıl devam etmeliyim except
?
HttpError
tanımlanan bir sınıftır Google'ın apiclient
lib 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_value
o zaman kullanıcıya gerek yok ; resp
varlık değildir denir .
HttpError
denedim 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 Mock
yanıt için nasıl örnek oluşturduğumla ilgilidir .
resp.status
orada kodu. NeredenHTTPError
geliyor?