Tôi đang làm việc trên một dự án liên quan đến kết nối với máy chủ từ xa, chờ phản hồi và sau đó thực hiện các hành động dựa trên phản hồi đó. Chúng tôi bắt một số ngoại lệ khác nhau và hoạt động khác nhau tùy thuộc vào ngoại lệ bị bắt. Ví dụ:Không thể bắt ngoại lệ giả mạo vì nó không thừa hưởng BaseException
def myMethod(address, timeout=20):
try:
response = requests.head(address, timeout=timeout)
except requests.exceptions.Timeout:
# do something special
except requests.exceptions.ConnectionError:
# do something special
except requests.exceptions.HTTPError:
# do something special
else:
if response.status_code != requests.codes.ok:
# do something special
return successfulConnection.SUCCESS
Để kiểm tra điều này, chúng tôi đã viết một bài kiểm tra như sau
class TestMyMethod(unittest.TestCase):
def test_good_connection(self):
config = {
'head.return_value': type('MockResponse',(), {'status_code': requests.codes.ok}),
'codes.ok': requests.codes.ok
}
with mock.patch('path.to.my.package.requests', **config):
self.assertEqual(
mypackage.myMethod('some_address',
mypackage.successfulConnection.SUCCESS
)
def test_bad_connection(self):
config = {
'head.side_effect': requests.exceptions.ConnectionError,
'requests.exceptions.ConnectionError': requests.exceptions.ConnectionError
}
with mock.patch('path.to.my.package.requests', **config):
self.assertEqual(
mypackage.myMethod('some_address',
mypackage.successfulConnection.FAILURE
)
Nếu tôi chạy chức năng trực tiếp, tất cả mọi thứ xảy ra như mong đợi. Tôi thậm chí đã thử nghiệm bằng cách thêm raise requests.exceptions.ConnectionError
vào mệnh đề try
của hàm. Nhưng khi tôi chạy thử nghiệm đơn vị của tôi, tôi nhận được
ERROR: test_bad_connection (test.test_file.TestMyMethod)
----------------------------------------------------------------
Traceback (most recent call last):
File "path/to/sourcefile", line ###, in myMethod
respone = requests.head(address, timeout=timeout)
File "path/to/unittest/mock", line 846, in __call__
return _mock_self.mock_call(*args, **kwargs)
File "path/to/unittest/mock", line 901, in _mock_call
raise effect
my.package.requests.exceptions.ConnectionError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "Path/to/my/test", line ##, in test_bad_connection
mypackage.myMethod('some_address',
File "Path/to/package", line ##, in myMethod
except requests.exceptions.ConnectionError:
TypeError: catching classes that do not inherit from BaseException is not allowed
Tôi cố gắng để thay đổi ngoại trừ tôi đã vá để BaseException
và tôi đã nhận một lỗi nhiều hay ít giống hệt nhau.
Tôi đã đọc https://stackoverflow.com/a/18163759/3076272 rồi, vì vậy tôi nghĩ rằng nó phải là một móc xấu __del__
ở đâu đó, nhưng tôi không chắc chắn nơi để tìm nó hoặc những gì tôi thậm chí có thể làm trong thời gian có nghĩa. Tôi cũng tương đối mới với unittest.mock.patch()
vì vậy rất có thể tôi đang làm điều gì đó sai ở đó.
Đây là một bổ trợ Fusion360 vì vậy nó đang sử dụng phiên bản đóng gói của Fusion 360 của Python 3.3 - theo như tôi biết đó là phiên bản vani (nghĩa là chúng không tự cuộn) nhưng tôi không tích cực .
FWIW Tôi đã có thể giải quyết vấn đề này bằng cách sử dụng http://stackoverflow.com/a/28507806/3076272, nhưng tôi muốn tìm hiểu lý do tại sao điều này xảy ra. – Dannnno
Có phải 'yêu cầu' ở đây là mô-đun của riêng bạn hay là mô-đun' yêu cầu' từ http://www.python-requests.org/? –
Một từ python-requests.org – Dannnno