Как выполнить модульное тестирование функции Python, которая возвращает относительный путь? - PullRequest
0 голосов
/ 13 апреля 2020

Я написал Python функцию, которая создает путь к файлу для набора данных. Я хотел бы включить doctest для функции. Однако, поскольку у каждой машины будет свой относительный путь к файлу, я не уверен, как написать тест, чтобы он проходил на любой машине.

import os

def get_dataset_file_path(date, filename):
    """Produces a filepath for the dataset.

    :parameter date (string): The date folder name.  Ex: "2020-02-05"
    :parameter filename (string): The csv filename.
    :returns filepath (string): The filepath for the dataset.

    Example:

    project_root
    ├── README.md
    ├── data
    │   └── 2020-04-13
    │       ├── README.md
    │       ├── data_description.txt
    │       ├── test.csv
    │       └── train.csv
    ├── docs
    ├── requirements.yml
    └── results
        └── 2020-04-13
            └── runall.py

    The function is called from the 'runall.py' file.
    >>> get_data_file_path('2020-04-13', 'train.csv')
    '~/project_root/data/2020-04-13/train.csv'
    """

    basepath = os.path.abspath('')
    filepath = os.path.abspath(os.path.join(basepath, "..", "..")) + "/data/" + date + "/" + filename
    return filepath

1 Ответ

1 голос
/ 13 апреля 2020

Я бы макет os.path.abspath.

Особенности зависят от вашей среды тестирования. Я предпочитаю pytest с pytest-mock и написал бы что-то вроде этого:

def get_dataset_file_path(mocker):
    mocked_abspath = mocker.patch('os.path.abspath')
    mocked_abspath.return_value = '/project_root/'
    assert get_data_file_path('2020-04-13', 'train.csv') == '/project_root/data/2020-04-13/train.csv'
...