Насмешливый python netmiko

Я создаю оболочку netmiko для проекта и пытаюсь написать несколько простых модульных тестов для проверки функциональности. Однако у меня возникли проблемы с издевательством над библиотекой netmiko. Мне удалось довольно легко смоделировать создание объекта ConnectHandler, но проверка того, что методы обработчика были вызваны, не работает должным образом.

В приведенном ниже коде вы увидите мою простую оболочку и модульные тесты. Проблема заключается в test_disconnect. Я пытаюсь проверить, что вызывается метод отключения, но по какой-то причине mock сообщает, что он не был вызван. Я уверен, что это как-то связано с тем, как я издеваюсь над netmiko, но я не уверен, что делаю не так.

MockSandbox.py

from netmiko import ConnectHandler, NetMikoTimeoutException


class SshLib(object):
    def __init__(self, ip, user, passwd, port=22):
        self.ip = ip
        self.user = user
        self.passwd = passwd
        self.port = port
        self.connection = None

    def login(self):
        args = {"device_type": "cisco_ios",
                "ip": self.ip,
                "username": self.user,
                "password": self.passwd,
                "port": self.port}

        try:
            self.connection = ConnectHandler(**args)
            return True
        except NetMikoTimeoutException:
            return False

    def disconnect(self):
        self.connection.disconnect()

MockSandboxTests.py

import mock
import unittest
from MockSandbox import SshLib


class SshLibTests(unittest.TestCase):
    @mock.patch("MockSandbox.ConnectHandler")
    def test_connect(self, mock_ssh):
        ssh = SshLib("1.1.1.1", "user", "password")
        return_val = ssh.login()

        args = {"device_type": "cisco_ios",
                "ip": "1.1.1.1",
                "username": "user",
                "password": "password",
                "port": 22}

        mock_ssh.assert_called_with(**args)
        self.assertTrue(return_val)

    @mock.patch("MockSandbox.ConnectHandler")
    def test_disconnect(self, mock_ssh):
        ssh = SshLib("1.1.1.1", "user", "password")
        ssh.login()
        ssh.disconnect()
        mock_ssh.disconnect.assert_called()


if __name__ == '__main__':
    unittest.main()

Тестовый выход

Failure
Traceback (most recent call last):
  File "C:\Python27\lib\unittest\case.py", line 329, in run
    testMethod()
  File "C:\Python27\lib\site-packages\mock\mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "C:\Users\user\Python\MockSandboxTests.py", line 26, in test_disconnect
    mock_ssh.disconnect.assert_called()
  File "C:\Python27\lib\site-packages\mock\mock.py", line 906, in assert_called
    raise AssertionError(msg)
AssertionError: Expected 'disconnect' to have been called.



Ran 2 tests in 0.020s

FAILED (failures=1)
2
0
565
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

mock.patch("MockSandbox.ConnectHandler") возвращает вам макет класса, поэтому mock_ssh.disconnect - это метод класса. Вместо этого вы хотите проверить метод экземпляра. Получите доступ к макету через mock_ssh.return_value:

mock_ssh.return_value.disconnect.assert_called()

Другие вопросы по теме