2014-09-18 4 views
2

Я хотел бы проверить, используя UnitTest, метод, который считывает из файла с помощью контекстного менеджера: макет открытым для модульного тестирования в Python

with open(k_file, 'r') as content_file: 
    content = content_file.read() 

Я не хочу, чтобы создать файл в моей системе, поэтому я хотел издеваться над этим, но на данный момент я не преуспеваю. Я нашел mock_open, но я действительно не понимаю, как я должен использовать его и кормить макет как content_file в моем тестовом примере. Здесь, например, это post, но я не понимаю, как следует писать это в тестовом примере без изменения исходного кода.

Может ли кто-нибудь указать мне в правильном направлении?

ответ

4

mock_open() - путь; вы залатать open в программном коде испытуемого с результатом в mock_open() вызова:

mocked_open = unittest.mock.mock_open(read_data='file contents\nas needed\n') 
with unittest.mock.patch('yourmodule.open', mocked_open, create=True): 
    # tests calling your code; the open function will use the mocked_open object 

patch() context manager будет поставить open() глобальный в ваш модуль (я назвал его yourmodule), связанным с mocked_open() -produced объекта. Этот объект будет притворяться, что создает объект файла при вызове.

Единственное, что этот макетный файл-объект не будет еще не итерация; вы не можете сделать с ним for line in content_file, по крайней мере, в текущих версиях библиотеки mock. См. Customizing unittest.mock.mock_open for iteration для работы.

+0

Спасибо! Я не понимал, куда мне позвонить, но теперь это работает. – fdhex

1

Альтернатива pyfakefs. Это позволяет создавать фальшивую файловую систему, записывать и читать файлы, устанавливать разрешения и т. Д., Даже не касаясь вашего реального диска. Он также содержит практический пример и учебник, в которых показано, как применять pyfakefs как для unittest, так и для doctest.