Я мог бы воспроизвести ошибку с минимальным примером:
foo.py:
class MyError(Exception):
pass
class A:
def inner(self):
err = MyError("FOO")
print(type(err))
raise err
def outer(self):
try:
self.inner()
except MyError as err:
print ("catched ", err)
return "OK"
Тест без насмешек:
class FooTest(unittest.TestCase):
def test_inner(self):
a = foo.A()
self.assertRaises(foo.MyError, a.inner)
def test_outer(self):
a = foo.A()
self.assertEquals("OK", a.outer())
Хорошо, все в порядке , оба теста пройдены
Проблема приходит с макетами. Как только класс MyError подвергается насмешке, предложение expect
ничего не может поймать, и я получаю ту же ошибку, что и пример из вопроса:
class FooTest(unittest.TestCase):
def test_inner(self):
a = foo.A()
self.assertRaises(foo.MyError, a.inner)
def test_outer(self):
with unittest.mock.patch('foo.MyError'):
a = exc2.A()
self.assertEquals("OK", a.outer())
Немедленно дает:
ERROR: test_outer (__main__.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "...\foo.py", line 11, in outer
self.inner()
File "...\foo.py", line 8, in inner
raise err
TypeError: exceptions must derive from BaseException
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#78>", line 8, in test_outer
File "...\foo.py", line 12, in outer
except MyError as err:
TypeError: catching classes that do not inherit from BaseException is not allowed
Здесь я получаю первый TypeError
, которого у вас не было, потому что я поднимаю макет, когда вы вызвали истинное исключение с 'requests.exceptions.ConnectionError': requests.exceptions.ConnectionError
в конфигурации. Но проблема остается в том, что предложение except
пытается поймать насмешку .
TL / DR: когда вы макетируете полный пакет requests
, предложение except requests.exceptions.ConnectionError
пытается поймать макет. Поскольку макет на самом деле не BaseException
, он вызывает ошибку.
Единственное решение, которое я могу себе представить, - не издеваться над полным requests
, а только частями, которые не являются исключениями. Должен признать, что я не мог найти, как сказать, чтобы издеваться над издевались над всем, кроме этого , но в вашем примере вам нужно только исправить requests.head
. Поэтому я думаю, что это должно работать:
def test_bad_connection(self):
with mock.patch('path.to.my.package.requests.head',
side_effect=requests.exceptions.ConnectionError):
self.assertEqual(
mypackage.myMethod('some_address',
mypackage.successfulConnection.FAILURE
)
То есть: исправлять только метод head
с исключением в качестве побочного эффекта.
Использование этого метода работает для меня 1 . Есть ли несколько элементов с классом селектора? Вы знаете, что этот элемент уже был добавлен в качестве средства выбора даты?
javascript:alert($("#datepicker").datepicker('option', 'dateFormat'));
в адресную строку, и он выдаст вам " мм / дд / гг. " Yes, it is a bug, and here's the bug report: http://dev.jqueryui.com/ticket/4301
UPDATE: the bug report indicates that this has already been fixed 3 years ago.