Tôi có một hàm ( foo
) gọi một hàm khác ( bar
). Nếu việc gọi bar()
tăng lên một HttpError
, tôi muốn xử lý đặc biệt nếu mã trạng thái là 404, nếu không thì tăng lại.
Tôi đang cố gắng viết một số bài kiểm tra đơn vị xung quanh foo
chức năng này , chế nhạo cuộc gọi tới bar()
. Thật không may, tôi không thể nhận được cuộc gọi bị chế nhạo bar()
để nêu ra một Ngoại lệ bị chặn bởi except
khối của tôi .
Đây là mã của tôi minh họa vấn đề của tôi:
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()
Tôi đã làm theo các tài liệu Mock nói rằng bạn nên đặt phiên bản side_effect
của một lớp Mock
thành một Exception
lớp để hàm bị chế nhạo có thể phát sinh lỗi.
Tôi cũng đã xem xét một số Q & As có liên quan khác của StackOverflow, và có vẻ như tôi đang làm điều tương tự mà họ đang làm để gây ra và Ngoại lệ được nêu ra bởi chế độ của họ.
- https://stackoverflow.com/a/10310532/346561
- Cách sử dụng Python Mock để nâng cao một ngoại lệ - nhưng với Errno được đặt thành một giá trị nhất định
Tại sao việc đặt giá side_effect
trị barMock
không làm tăng dự kiến Exception
? Nếu tôi đang làm điều gì đó kỳ lạ, tôi nên kiểm tra logic trong except
khối của mình như thế nào?
HttpError
là một lớp được định nghĩa trong lib của Googleapiclient
mà chúng tôi sử dụng trong GAE. Nó __init__
được xác định với các tham số, (resp, content)
vì vậy tôi đã cố gắng tạo một phiên bản giả cho phản hồi, với mã trạng thái thích hợp được chỉ định.
return_value
sau đó; resp
không được gọi .
HttpError
và thay vào đó chỉ thử sử dụng một phiên bản thông thường Exception
. Điều này hoạt động hoàn hảo. Điều này có nghĩa là nó phải HttpError
liên quan đến cách tôi định cấu hình phiên bản, có thể liên quan đến cách tôi tạo một Mock
phiên bản cho phản hồi.
resp.status
mã ở đó như thế nào . Từ đâuHTTPError
đến?