Я не эксперт, но я дам ему идти , Сначала немного рефакторинга: сделайте их функциональными (удалите все предметы класса), удалите ненужные вещи. Это должно значительно облегчить тестирование. Вы всегда можете заставить класс вызвать эти функции, если вы действительно хотите его в классе.
def pass_file_name(base_filename, exists):
"""return a list of filenames that exist
based upon `base_filename`.
use `os.path.isfile` for `exists`"""
log_files = []
if exists(base_filename):
log_files.append(base_filename)
for i in range(1, 8):
filename = base_filename + "." + str(i)
if exists(filename):
log_files.append(filename)
return log_files
def read_log_files (self, log_files):
"""read and parse each line from log_files
use `pass_file_name` for `log_files`"""
log_entrys = []
for filename in log_files:
with open(filename) as myfile:
for line in myfile:
log_entrys.append(line.split())
return log_entrys
Теперь мы можем легко проверить pass_file_name
пропускания в пользовательской функции exists
.
class Test_pass_file_name(unittest.TestCase):
def test_1(self):
"""assume every file exists
make sure all logs file are there"""
exists = lambda _: True
log_files = pass_file_name("a", exists)
self.assertEqual(log_files,
["a", "a.1", "a.2", "a.3",
"a.4", "a.5", "a.6", "a.7"])
def test_2(self):
"""assume no files exists
make sure nothing returned"""
exists = lambda _: False
log_files = pass_file_name("a", exists)
self.assertEqual(log_files, [])
# ...more tests here ...
Как мы предполагаем, os.path.isfile
работы мы должны иметь довольно хорошее тестирование первой функции. Хотя вы всегда можете получить тест на самом деле, создайте несколько файлов, затем вызовите pass_file_name
с exists = os.path.isfile
.
Второе испытание труднее; Мне сказали, что лучшие (единичные) тесты не касаются сети, баз данных, графического интерфейса или жесткого диска. Так что, возможно, некоторые рефакторинги облегчат его работу. Смысл открытия мог бы работать; или бы мог фактически написать какой-нибудь длинный файл в функции тестирования и читать их.
How do I mock an open used in a with statement (using the Mock framework in Python)?
"... так что это может быть либо имя файла, либо файл-подобный объект" Как это сделать? Проверьте экземпляр str (имя файла), иначе предположите, что это объект ввода-вывода? – Symmitchry