2015-10-23 2 views
1

Есть ли способ обмануть DictReader для модульного тестирования, не имея необходимости писать файл, а затем снова открыть его.Mock CSV DictReader

Мои функции принимают экземпляр DictReader, поэтому я могу просто передать их один, чтобы проверить их функциональность, но, похоже, не может получить его, не открывая файл.

В настоящее время я вручную пишу CSV-файл, а затем удаляю его каждый тест.

class TestRowsStuff(unittest.TestCase): 
    def write_csv(self, path, iterable): 
     with open(path, 'wb') as f: 
      writer = csv.DictWriter(f, [PP, SN, TN]) 
      writer.writeheader() 
      writer.writerows(iterable) 

    def setUp(self): 
     ... 
     self.test_file = os.path.join('test.csv') 
     self.write_csv(self.test_file, test_values) 

    def tearDown(self): 
     os.remove(self.test_file) 
+0

Почему бы просто не использовать объект StringIO в памяти для хранения/чтения файла? – Anzel

ответ

4

Вы можете использовать в памяти StringIO объект для хранения/читать Unicode/строки:

In [10]: from StringIO import StringIO 

In [11]: import csv 

In [12]: csvfile = StringIO() 

In [13]: csvfile.seek(0) 

# sample taken from [here](https://docs.python.org/2/library/csv.html)  
In [14]: fieldnames = ['first_name', 'last_name'] 

In [15]: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

In [16]: writer.writeheader() 

In [17]: writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) 

In [18]: writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) 

In [19]: writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'}) 

In [20]: csvfile.seek(0) 

Чтобы прочитать его обратно:

In [21]: csvfile.readlines() 
Out[21]: 
['first_name,last_name\r\n', 
'Baked,Beans\r\n', 
'Lovely,Spam\r\n', 
'Wonderful,Spam\r\n'] 

Если вы хотите использовать в буфере памяти вместо этого вы также можете использовать io.StringIO.

+0

Это выглядит интересно. Я дам ему попробовать. Это не тест, который будет запускаться очень часто, но просто неудобно, что мне приходилось писать файл снова и снова. – electrometro

Смежные вопросы