Я пытаюсь использовать mock_open()
для тестирования моего приложения имитировать чтение файла с помощью декоратора исправлений и side_effect, но я не могу проверить глобальный набор значений из функции в тесте. Он работает только тогда, когда есть значение, возвращаемое функцией.
Фрагмент кода моего приложения выглядит примерно так
#!/usr/bin/env python
# -*- coding: utf-8 -*-
thresh_dict = {}
allowed_san_dict = {}
max_eval_count = ""
clear_eval_count = ""
def generate_cfg_thresh_map():
""" For generating a mapping table containing the thresholds for each of the
production devices. The file is read one line at a time and split on whitespace
to get the individual fields
"""
global allowed_san_dict
global max_eval_count
global clear_eval_count
try:
with open ('/opt/config/pwr_thresh_cfg', 'r') as fh:
for line in fh:
split_line = line.split()
if line.startswith("ENTRY_THRESH_COUNT"):
max_eval_count = int(split_line[1])
elif line.startswith("EXIT_THRESH_COUNT"):
clear_eval_count = int(split_line[1])
else:
thresh_dict[split_line[0]] = [int(split_line[1]), int(split_line[2]), int(split_line[3])]
allowed_san_dict[split_line[0]] = int(split_line[4])
except Exception as error:
log_to_journal('read failed from pwr_thresh_cfg')
и файл test_app.py
выглядит так
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Include require py.test libraries for the suite to run
import unittest
import pytest
import mock
import app
from mock import patch, mock_open
class ReportMonitor(unittest.TestCase):
def test_generate_cfg_thresh_map(self):
with patch('app.open', mock_open(read_data='ENTRY_THRESH_COUNT 200')) as _:
app.generate_cfg_thresh_map()
assert app.max_eval_count == 200
print('value for %s' % (app.max_eval_count))
print('value for %s' % (app.generate_cfg_thresh_map()))
Проблема в том, что я хочу утверждать значение max_eval_count
, установленное в функции generate_cfg_thresh_map()
. Поскольку значение устанавливается в глобальной переменной и не возвращается из функции, я не могу подтвердить значение в своем тестовом примере. Я не могу использовать return
из функции, т.е. вообще не менять код приложения.
Как бы я это сделал? т. е. запустить тестируемую функцию и проверить значение, установленное функцией для тестовой строки, и утвердить модульный тестовый пример в зависимости от значения, установленного функцией.
read_data
не имитирует итератор файлового объекта, поэтому либо измените его наfor line in fh.readlines()
в функции, либо заплатитеmock_open
механизм имитации итерации. - person hoefling   schedule 13.06.2019mock_open
: stackoverflow.com/q/24779893/2650249 - person hoefling   schedule 13.06.2019