আমার একটি ফাংশন রয়েছে ( 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
ব্যঙ্গ ফাংশন বাড়াতে ত্রুটি আছে বর্গ।
আমি অন্য কিছু সম্পর্কিত স্ট্যাকওভারফ্লো প্রশ্নোত্তর হিসাবেও দেখেছি এবং দেখে মনে হচ্ছে যে তারা তাদের মক দ্বারা উত্থাপিত হওয়ার কারণ হিসাবে এবং ব্যতিক্রম করার জন্য তারা করছে একই কাজ করছি।
- https://stackoverflow.com/a/10310532/346561
- ব্যতিক্রম বাড়াতে পাইথন মক কীভাবে ব্যবহার করবেন - তবে এর্নো প্রদত্ত মানকে সেট করে
কেন সেটিং করা হয় side_effect
এর barMock
প্রত্যাশিত ঘটাচ্ছে না Exception
উত্থাপিত হবে? আমি যদি অদ্ভুত কিছু করে থাকি তবে আমার except
ব্লকটিতে যুক্তি পরীক্ষা করার উপায়টি কীভাবে করব ?
HttpError
কোন ক্লাসে সংজ্ঞায়িত গুগলের apiclient
liberal এর সংক্ষিপ্ত রূপ যা আমরা Gae তাতে ব্যবহার করুন। এটি __init__
প্যারামগুলির সাথে সংজ্ঞায়িত করা হয়েছে (resp, content)
তাই আমি যথাযথ স্থিতি কোডটি উল্লেখ করে প্রতিক্রিয়ার জন্য একটি মক উদাহরণ তৈরি করার চেষ্টা করছিলাম।
HttpError
এবং পরিবর্তে কেবল একটি নিয়মিত Exception
উদাহরণ ব্যবহার করার চেষ্টা করেছি । এটি পুরোপুরি কাজ করে। এর অর্থ হ'ল আমি HttpError
উদাহরণটি কীভাবে কনফিগার করছি তার সাথে অবশ্যই কিছু করার দরকার আছে , সম্ভবত আমি Mock
প্রতিক্রিয়াটির জন্য উদাহরণ তৈরি করছি এর সাথে সম্পর্কিত ।
resp.status
কোড আছে। কোথাHTTPError
থেকে আসে?