Я работаю над проектом, который включает подключение к удаленному серверу, ожидание ответа, а затем выполнение действий на основе этого ответа. Мы ловим пару разных исключений и ведем себя по-разному в зависимости от того, какое исключение поймано. Например:
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
Чтобы проверить это, мы написали тест, подобный следующему
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
)
Если я запускаю функцию напрямую, все происходит так, как ожидалось. Я даже проверил, добавив raise requests.exceptions.ConnectionError
в предложение try
функции. Но когда я запускаю модульные тесты, я получаю
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
Я попытался изменить исключение, которое я исправлял, на BaseException
, и я получил более или менее идентичную ошибку.
Я уже прочитал https://stackoverflow.com/a/18163759/3076272, поэтому я думаю, что это должно быть плохой __del__
где-то зацепился, но я не знаю, где его искать и что я могу сделать в это время. Я также относительно новичок в unittest.mock.patch()
, так что вполне возможно, что я тоже делаю что-то не так.
Это надстройка Fusion360, поэтому она использует упакованную версию Fusion 360 Python 3.3 — насколько я знаю, это ванильная версия (т. Е. Они не выпускают свои собственные), но я не уверен в этом.
requests
вашим собственным модулем или это модульrequests
с сайта python-requests.org? - person Serge Ballesta   schedule 07.08.2015