Как протестировать файлы с pyfakefs в синхронном тестовом классе - PullRequest
0 голосов
/ 11 января 2019

Рассмотрим функцию в модуле.

async def _get_user_mapping():
        async with aiofiles.open('/etc/subuid') as f:
            async for line in f:
                print(line)

И тестовый класс

from atestfile import _get_user_mapping
class TestFS(fake_filesystem_unittest.TestCase):
    def setUp(self):
        self.a_required_class_parameter = True
        self.setUpPyfakefs()
        for file_path in ['/etc/subuid']:
            self.fs.create_file(file_path, contents = """testuser:100000:65536
            testuser2:165536:65536""")

    def test(self):
        if self.a_required_class_parameter:
            asyncio.get_event_loop().run_until_complete(_get_user_mapping())

В этом примере тестовая функция должна установить pyfakefs для предоставления поддельного файла. К сожалению, у aiofiles нет доступа к файлу, и печатный вывод является реальным файлом в системе.

Кто-нибудь знает, как я могу пропатчить цикл обработки событий aiofiles, чтобы использовать pyfakefs в качестве поддельной файловой системы? При тестировании я обнаружил следующий фрагмент с использованием библиотеки с именем pytest-aiofiles (звучит как то, что мне нужно, верно?), Но пример, который они показывают:

@pytest.mark.asyncio
async def test_stuff(self):
    filename = 'test'
etc.....

Если я добавлю декоратор mark.asyncio в метод класса test, импортированная функция не будет иметь доступа к сгенерированному поддельному файлу в методе setUp.

Я предполагаю, что упускаю что-то простое, поэтому на самом деле все это можно разбить на простой вопрос: Как, черт возьми, я это проверяю?

Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Вы могли бы создать класс для патча 'aiofiles'?

class FakeAiofiles
    def open():
        # return the open fake file you created in the test

затем в своем тесте используйте:

def test(self):
    with mock.patch('atestfile.aiofiles', return_value=FakeAiofiles)
        if self.a_required_class_parameter:
            asyncio.get_event_loop().run_until_complete(_get_user_mapping())
...