J'ai des problèmes pour tester les exceptions qui seraient levées dans un avec python 3.4. Je ne peux pas obtenir l'exécution des tests pour cette paix de code:Python 3: comment tester les exceptions avec?
import logging
...
class Foo(object):
...
def foo(self, src, dst):
try:
with pysftp.Connection(self._host, username=self._username, password=self._password) as connection:
connection.put(src, dst)
connection.close()
except (
ConnectionException,
CredentialException,
SSHException,
AuthenticationException,
HostKeysException,
PasswordRequiredException
) as e:
self._log.error(e)
Et voilà comment je veux le tester:
import logging
...
class TestFoo(TestCase):
@parameterized.expand([
('ConnectionException', ConnectionException),
('CredentialException', CredentialException),
('SSHException', SSHException),
('AuthenticationException', AuthenticationException),
('HostKeysException', HostKeysException),
('PasswordRequiredException', PasswordRequiredException),
])
@patch('pysftp.Connection', spec_set=pysftp.Connection)
def test_foo_exceptions(self, _, ex, sftp_mock):
"""
NOTE: take a look at:
http://stackoverflow.com/questions/37014904/mocking-python-class-in-unit-test-and-verifying-an-instance
to get an understanding of __enter__ and __exit__
"""
sftp_mock.return_value = Mock(
spec=pysftp.Connection,
side_effect=ex,
__enter__ = lambda self: self,
__exit__ = lambda *args: None
)
foo = Foo('host', 'user', 'pass', Mock(spec_set=logging.Logger))
foo.foo('src', 'dst')
self.assertEqual(foo._log.error.call_count, 1)
Mais il échoue - Sortie:
Failure
...
AssertionError: 0 != 1
Voulez-vous dire 'exceptions dans 'pysftp.Connection' instanciation' ou lorsque vous appelez' connection.something() '? – ForceBru
Que voulez-vous dire par * avec un 'with' *? Qu'est-ce qui soulève l'exception? Le gestionnaire de contexte que vous créez pour l'utiliser avec 'with'? Ou le gestionnaire de contexte est-il supposé gérer une exception déclenchée dans le bloc géré par 'with'? –
Vous créez l'exception comme effet secondaire de * création * de votre gestionnaire de contexte (l'appel 'pysftp.Connection (..)' le soulève). L'instruction 'with 'ne peut jamais l'utiliser comme gestionnaire de contexte, et le bloc géré par' with' n'est jamais exécuté. Donc, votre code exerce correctement l'instruction 'try: ... sauf .. ', mais vous n'avez besoin d'aucune connaissance du gestionnaire de contexte. Ce qui ne va pas, c'est comment le logger est appelé. –