ฉันมีฟังก์ชัน ( 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
ระดับที่จะมีการเพิ่มฟังก์ชั่นล้อเลียนข้อผิดพลาด
ฉันยังดู Q & As อื่น ๆ ที่เกี่ยวข้องของ StackOverflow และดูเหมือนว่าฉันกำลังทำสิ่งเดียวกับที่พวกเขาทำเพื่อก่อให้เกิดและข้อยกเว้นที่จะถูกยกขึ้นโดยการเยาะเย้ยของพวกเขา
- https://stackoverflow.com/a/10310532/346561
- วิธีใช้ Python Mock เพื่อเพิ่มข้อยกเว้น - แต่ Errno ตั้งค่าเป็นค่าที่กำหนด
เหตุใดจึงตั้งค่าside_effect
ของbarMock
ไม่ได้ก่อให้เกิดความคาดหวังException
ที่จะได้รับการเลี้ยงดู? ถ้าฉันทำอะไรแปลก ๆ ฉันจะทดสอบตรรกะในexcept
บล็อกของฉันได้อย่างไร
HttpError
เป็นคลาสที่กำหนดไว้ในlib ของ Googleapiclient
ซึ่งเราใช้ใน GAE มัน__init__
ถูกกำหนดด้วยพารามิเตอร์(resp, content)
ดังนั้นฉันจึงพยายามสร้างอินสแตนซ์จำลองสำหรับการตอบสนองพร้อมระบุรหัสสถานะที่เหมาะสม
HttpError
และลองใช้แค่Exception
อินสแตนซ์ทั่วไปแทน นี้ทำงานได้อย่างสมบูรณ์ ซึ่งหมายความว่าต้องมีส่วนเกี่ยวข้องกับวิธีที่ฉันกำหนดค่าHttpError
อินสแตนซ์ซึ่งอาจเกี่ยวข้องกับวิธีที่ฉันสร้างMock
อินสแตนซ์สำหรับการตอบสนอง
resp.status
รหัสที่นั่นอย่างไร ในกรณีที่ไม่HTTPError
มาจากไหน?