Я пытаюсь выполнить unittest функции синтаксического анализа, которые принимают путь к файлу и возвращают часть содержимого файла. Я хотел бы иметь возможность передавать этим функциям строки данных для целей тестирования.
Я понимаю, что могу передать csv.reader () либо StringIO, либо file_handle (например, csv.reader (StringIO ("my, data") или csv.reader (open (file))), но я не вижу способа что я могу передать объект StringIO вместо filepath, поскольку open (StringIO ("my, data")) не работает. Точно так же я хочу иметь логику открытия / закрытия файла в этих методах синтаксического анализа, а не в основной части моего кода, так как это загромождает мой основной код, а также означает, что мне придется переписать все интерфейсы ввода-вывода файлов!
Кажется, мой выбор:
- Перепишите весь существующий код так, чтобы он передавал дескрипторы файлов функциям синтаксического анализа - это настоящая боль!
- Используйте mock.patch () для замены метода open () - это должно работать, но кажется более сложным, чем того требует эта задача!
- Сделайте то, о чем я еще не думал, но убежден, что должно существовать!
import csv
def parse_file(input):
with open(input, 'r') as f:
reader = csv.reader(f)
output = []
for row in reader:
#Do something complicated
output.append(row)
return output
import unittest
class TestImport(unittest.TestCase):
def test_read_string(self):
string_input = u"a,b\nc,d\n"
output = read_file(string_input)
self.assertEqual([['a', 'b'], ['c', 'd']], output)
def test_read_file(self):
filename = "sample_data.csv"
output = read_file(filename)
self.assertEqual([['a', 'b'],['c', 'd']], output)