Tôi có một chức năng (foo
) gọi một chức năng khác (bar
). Nếu gọi bar()
tăng HttpError
, tôi muốn xử lý nó đặc biệt nếu mã trạng thái là 404, nếu không thì sẽ tăng.Mocking một chức năng để nâng một ngoại lệ để kiểm tra một khối ngoại trừ
Tôi đang cố gắng viết một số bài kiểm tra đơn vị xung quanh chức năng foo
này, nhổ cuộc gọi đến bar()
. Rất tiếc, tôi không thể nhận cuộc gọi nhạo báng đến số bar()
để tăng ngoại lệ bị chặn bởi khối except
của tôi.
Đây là mã của tôi mà 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 Mock docs mà nói rằng bạn nên thiết lập các side_effect
của một trường hợp Mock
để một lớp Exception
để có chức năng chế giễu nâng cao lỗi.
Tôi cũng đã xem xét một số StackOverflow khác có liên quan Q & Như, và có vẻ như tôi đang làm điều tương tự mà chúng đang làm để gây ra và Ngoại lệ được nâng lên bởi mô hình của chúng.
- https://stackoverflow.com/a/10310532/346561
- How to use Python Mock to raise an exception - but with Errno set to a given value
Tại sao thiết lập side_effect
của barMock
không gây ra dự kiến Exception
được nâng lên? Nếu tôi đang làm điều gì đó kỳ lạ, làm thế nào tôi nên đi về thử nghiệm logic trong khối except
của tôi?
Tôi khá chắc chắn ngoại lệ của bạn * đang được nâng lên, nhưng tôi không chắc chắn cách bạn đang đặt mã 'resp.status' ở đó. 'HTTPError' xuất phát từ đâu? –
@MartijnPieters 'HttpError' là một lớp được định nghĩa trong [lib' libiclient' của Google] (https://developers.google.com/api-client-library/python/) mà chúng tôi sử dụng trong GAE. Đó là '__init__' được định nghĩa với các tham số' (resp, content) 'vì vậy tôi đã cố tạo một cá thể giả cho đáp ứng, với mã trạng thái thích hợp được chỉ định. –
Phải, vậy là [lớp này] (https://github.com/google/google-api-python-client/blob/master/googleapiclient/errors.py#L35-L63); nhưng bạn không cần phải sử dụng 'return_value' rồi; 'resp' không được * gọi là *. –