Ich habe Probleme, Ausnahmen zu testen, die in einem mit in Python 3.4 ausgelöst werden würde. Ich kann nur erhalten nicht die Tests für diesen Frieden von Code ausführen:Python 3: Wie testet man Ausnahmen innerhalb mit?
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)
Und das ist, wie ich will, es testen:
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)
aber es funktioniert nicht - Ausgang:
Failure
...
AssertionError: 0 != 1
Meinen Sie 'Ausnahmen in 'pysftp.Connection' Instanziierung' oder beim Aufruf von' connection.something() '? – ForceBru
Was meinst du mit * mit einem 'mit' *? Was löst die Ausnahme aus? Der Kontextmanager, den Sie für die Verwendung in 'with' erstellen? Oder soll der Kontextmanager eine Ausnahme behandeln, die in dem mit 'mit' verwalteten Block ausgelöst wird? –
Sie lösen die Ausnahme als Nebeneffekt von * creating * Ihrem Kontextmanager aus (der 'pysftp.Connection (..)' Aufruf löst dies aus). Die 'with'-Anweisung kann sie niemals als Kontextmanager verwenden, noch wird die von 'with' gemanagte Blockade jemals ausgeführt. Ihr Code übt also die Anweisung 'try: ... except ..' korrekt aus, aber Sie benötigen keinerlei Kenntnisse des Kontextmanagers. Was dann falsch läuft, ist, wie der Logger aufgerufen wird. –