foo
別の関数(bar
)を呼び出す関数()があります。呼び出しでbar()
が発生したHttpError
場合、ステータスコードが404の場合は特別に処理し、それ以外の場合は再発生させます。
このfoo
関数の周りにいくつかの単体テストを書いて、への呼び出しを模倣しようとしていますbar()
。残念ながら、ブロックでbar()
キャッチされた例外を発生させるためにモックされた呼び出しを取得できませんexcept
。
これが私の問題を説明する私のコードです:
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()
私は続いモックドキュメントあなたが設定しなければならないことを言うside_effect
のMock
にインスタンスをException
嘲笑関数raiseにエラーを持っているクラスを。
他の関連するStackOverflowのQ&Aも確認しましたが、彼らが引き起こしているのと同じことをしていて、モックによって例外が発生しているようです。
なぜ期待値が発生しないという設定になっているside_effect
のですか?奇妙なことをしている場合、ブロック内のロジックをテストするにはどうすればよいですか?barMock
Exception
except
HttpError
は、GAEで使用するGoogleのapiclient
libで定義されたクラスです。これ__init__
はparamsで定義されている(resp, content)
ため、適切なステータスコードを指定して、応答のモックインスタンスを作成しようとしました。
HttpError
、代わりに通常のException
インスタンスのみを使用してみました。これは完全に機能します。これは、HttpError
インスタンスの構成方法に何らかの関係がある必要があることを意味します。おそらくMock
、応答のインスタンスを作成する方法に関連しています。
resp.status
そこでコードをどのように設定しているかはわかりません。どこHTTPError
から来たの?