Я пытаюсь использовать 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
из функции, то есть вообще не изменять код приложения.
Как бы я это сделал? то есть запустите тестируемую функцию и проверьте значение, установленное функцией для тестовой строки, и подтвердите случай модульного теста в зависимости от значения, установленного функцией.