Издевательский Pathlib write_text?

#python #mocking

Вопрос:

Я пишу простую функцию для записи диктанта на диск с помощью некоторого преобразования и yaml. Самый простой способ проверить, что происходит, — это захватить выходные Path(file_name).write_text(text_to_write) данные . Но мне трудно понять, что именно мне нужно сделать, чтобы захватить этот контент.

 def test_path_write():
    with mock.patch('Path.write_text', return_value=None):
        function_that_uses_path_write_text()
        assert 'Content I would like to be in the file' in SOME_KIND_OF_CAPTURE
 

Есть идеи, как я могу получить что-то в SOME_KIND_OF_CAPTURE, что я могу использовать для тестирования?

Ответ №1:

Вы ищете что-то вроде следующего?

 

with patch.object(Path, 'write_text') as patch_path:
    data_to_write = 'Something'
    patch_path.return_value = data_to_write

    path = Path('some/path')
    res = path.write_text(data_to_write)

print(res)
 

Комментарии:

1. Я думаю, что мне бы хотелось использовать что — то вроде StringIO для записи того, что было на самом деле написано, — чтобы это было не возвращаемое значение, а значение, которое, как думал Path, он записывал.

Ответ №2:

Используя pytest, вот что я сделал:

 def test_writer(mocker):
    mocker.patch.object(Path, "write_text")

    [...]

    written_content = Path.write_text.call_args_list[0][0][0]