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.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage