Es kann keine verspottete Ausnahme abgefangen werden, da BaseException nicht geerbt wird.
Ich arbeite an einem Projekt, bei dem eine Verbindung zu einem Remoteserver hergestellt wird, auf eine Antwort gewartet wird und anschließend Aktionen basierend auf dieser Antwort ausgeführt werden. Wir erfassen einige verschiedene Ausnahmen und verhalten uns abhängig davon, welche Ausnahme erfasst wird, unterschiedlich. Beispielsweise
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
Um dies zu testen, haben wir einen Test wie den folgenden geschrieben
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
)
Wenn ich die Funktion direkt ausführe, geschieht alles wie erwartet. Ich habe sogar durch Hinzufügen von @ getestraise requests.exceptions.ConnectionError
zumtry
-Klausel der Funktion. Aber wenn ich meine Unit-Tests durchführe, bekomme ich
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
Ich habe versucht, die Ausnahme zu ändern, in die ich mich eingepatcht habe.BaseException
und ich habe einen mehr oder weniger identischen Fehler.
Ich habe gelesenhttps: //stackoverflow.com/a/18163759/307627 schon, also ich denke, es muss ein schlechtes sein__del__
hook irgendwo, aber ich bin mir nicht sicher wo ich danach suchen soll oder was ich in der Zwischenzeit noch machen kann. Ich bin auch relativ neu beiunittest.mock.patch()
also ist es sehr gut möglich, dass ich dort auch etwas falsch mache.
Dies ist ein Fusion360-Add-In und verwendet daher die in Fusion 360 enthaltene Version von Python 3.3 - soweit ich weiß, handelt es sich um eine Vanille-Version (d. H. Sie haben keine eigene Version), aber ich bin mir dessen nicht sicher.