лучший способ издеваться над питоном, используя mock и patch ||netmiko - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу проверить свой код, где путем насмешки netmiko.connectHandler.Поскольку объект, возвращаемый netmiko.connectHanler, будет иметь функцию, названную send_command, и мне нужно получить динамическое значение из функции, я должен написать свой тест следующим образом.

def mock_device_login(device_type, host, user, password):
    fixture_file = os.path.join("tests/fixtures", "device_health_status.json")
    dummy_stuff = json.loads(open(fixture_file, "r").read())
    class mock_class(object):
        def send_command(self, command):
            return_dict = {'sh module' : dummy_stuff['module_output'],
                            'sh env alarm' : dummy_stuff['environment_output'],
                            'sh process cpu | inc CPU utilization' : dummy_stuff['cpu_usage_output'],
                            'sh ip bgp summary' : 'bgp summary',
                            'sh int desc': 'sh int desc',
                            'sh clock' : "*09:01:10.516 UTC Sun Aug 15 1993"
                            }
            return return_dict[command]


    return  { "response": {"logged_in": True, "details": "successfully logged in", "next_action": "execute command" }, "result": True, "connection": mock_class() }


@patch('device_health_status.device_login', side_effect = mock_device_login)
def test_device_status(self, mock_device_login):
    action = self.get_action_instance()

    actionResult,json_result = action.run(device_type, host, username, password)
    print(json_result['error_summary'])
    self.assertTrue(actionResult, True)
    self.assertEquals(json_result['environment_status'], 'GOOD')
    self.assertEquals(json_result['cpu_usage'], 'GOOD')
    self.assertEquals(json_result['module_status'], 'GOOD')
    self.assertEquals(json_result['overall_device_status'], "GOOD")

Этот код предназначен для штормового стека,так что action.run - это основная функция.Этот код работает абсолютно нормально, моя проблема в том, что мне приходилось писать этот блок много раз, изменяя вывод команды в return_dict, так как я хочу проверить свой код на различных выходных данных устройства.

Я знаю, что естьтакие вещи, как @ ddt / @ data / @ распаковать.Но я не уверен, как использовать их здесь, чтобы мне не приходилось повторять один и тот же блок снова и снова.

В моем тестовом файле у меня есть 13 таких случаев, и тестовый файл довольно большой.

Пожалуйста, дайте мне знать, если вопрос не разрешен.Больше о Netmiko можно найти здесь: https://pypi.org/project/netmiko/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...