Протестируйте функцию в Python, которая объединяет файлы и ничего не возвращает

#python #pytest #python-unittest #python-unittest.mock

#python #pytest #python-unittest #python-unittest.mock

Вопрос:

У меня есть задача написать тест для следующей функции:

 def merge_files(cwd: Path, source: str, target: str):
    """[Merges the content of two files of the same data type]

    Parameters
    ----------
    cwd : Path
        [Path of the the current work directory]
    source : str
        [File used to merge with target, lives in app subfolder]
    target : str
        [File used to merge with source]
    """
    with open(os.path.join(cwd, "app", target), "a") as requirements_tool:
        with open(os.path.join(cwd, source), "r") as requirements_user:
            requirements_tool.write(requirements_user.read())
 

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

Кто-нибудь знает, как реализовать тест для таких функций?

Редактировать: файлы будут requirements.txt и requirements-dev.txt

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

1. создайте 2 входных файла и 1 ожидаемый выходной файл. Сравните ожидаемый выходной файл с фактическим выходным файлом.

2. Вы могли бы использовать реальные файлы A, B и C, где C — это предопределенное слияние A и B. Затем запустите функцию для объединения A и B и посмотрите, получите ли вы то же содержимое, что и C. В конце теста удалите ваш временный выходной файл.

3. @drum: Можете ли вы показать мне, как это сделать? Должен ли я использовать для этого реальные файлы или использовать mocks?

4. Я не вижу проблем с чтением реальных файлов. Тестовый скрипт сам по себе является файлом, поэтому нет причин не сохранять объединяемые файлы и ожидаемый результат по ходу теста.

Ответ №1:

Вы можете создать временный каталог с помощью tempfile.TemporaryDirectory . Затем вы можете создать все содержимое, необходимое для выполнения теста внутри этого каталога, а затем вызвать вашу функцию слияния. Например:

 from pathlib import Path
from tempfile import TemporaryDirectory

def test_merge_files():
    with TemporaryDirectory() as td:
        td = Path(td)
        f_target = td / 'app' / 'target'
        f_source = td / 'source'
        example_content_target = 'foo'
        example_content_source = 'bar'
        f_target.parent.mkdir()
        f_target.write_text(example_content_target)
        f_source.write_text(example_content_source)
        merge_files(td, source=f_source, target=f_target)
        assert f_target.read_text() == f'{example_content_target}{example_content_source}')
 

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

1. спасибо, действительно приятно! Я не знал о временных каталогах!