Impossible d'intercepter l'exception simulée car elle n'hérite pas BaseException

Je travaille sur un projet qui implique la connexion à un serveur distant, en attente d'une réponse, et puis en effectuant des actions basées sur la réponse. Nous attraper un couple de différentes exceptions, et se comportent différemment selon exception est interceptée. Par exemple:

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

Pour tester cela, nous avons rédigé un test comme suit

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
            )

Si je lance directement la fonction, tout se passe comme prévu. J'ai même testé en ajoutant raise requests.exceptions.ConnectionError à la try de la clause de la fonction. Mais quand je lance mes tests unitaires, - je obtenir

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

J'ai essayé de changer l'exception que j'ai été correctifs à BaseException et j'ai eu plus ou moins de la même erreur.

J'ai lu https://stackoverflow.com/a/18163759/3076272 déjà, donc je pense que ça doit être une mauvaise __del__ crochet quelque part, mais je ne sais pas où chercher pour elle ou ce que je peux même le faire dans le temps de le dire. Je suis aussi relativement nouveau pour unittest.mock.patch() il est donc très possible que je suis en train de faire quelque chose de mal.

C'est un Fusion360 ajoutez-en si c'est à l'aide de la Fusion 360 est emballé version de Python 3.3 - pour autant que je sais que c'est une version classique (c'est à dire qu'ils ne roulent pas leurs propres), mais je ne suis pas positif.

source d'informationauteur Dannnno