मेरे पास एक फ़ंक्शन ( 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
मज़ाक उड़ाया समारोह बढ़ाने त्रुटि के लिए वर्ग।
मैंने कुछ अन्य संबंधित StackOverflow Q & As को भी देखा, और ऐसा लग रहा है कि मैं वही काम कर रहा हूं जो वे कर रहे हैं और अपवाद उनके मजाक द्वारा उठाया जा रहा है।
- https://stackoverflow.com/a/10310532/346561
- एक अपवाद बढ़ाने के लिए पायथन मॉक का उपयोग कैसे करें - लेकिन दिए गए मूल्य के लिए एर्रनो के साथ
क्यों स्थापित कर रही है side_effect
की barMock
उम्मीद के कारण नहीं Exception
उठाया जा? अगर मैं कुछ अजीब कर रहा हूं, तो मुझे अपने except
ब्लॉक में तर्क परीक्षण के बारे में कैसे जाना चाहिए ?
return_value
तब उपयोगकर्ता की आवश्यकता नहीं है ; resp
नहीं बुलाया जा रहा है ।
HttpError
कोशिश की और इसके बजाय सिर्फ एक नियमित Exception
उदाहरण का उपयोग करने की कोशिश की । यह पूरी तरह से काम करता है। इसका मतलब यह है कि यह कुछ करना होगा कि मैं कैसे HttpError
उदाहरण को कॉन्फ़िगर कर रहा हूं , संभवत: संबंधित है कि मैं कैसे Mock
प्रतिक्रिया के लिए एक उदाहरण बना रहा हूं ।
resp.status
कोड वहाँ। कहाँHTTPError
से आता है?