издевательство над поддеревом каталога для pytest

У меня есть рекурсивный код для сбора тестов из заданного каталога. Он опирается на несколько функций: isdir, isfile и доступ к файлам. Ожидается, что каталоги могут быть перечислены с помощью os.listdir.

Чтобы протестировать эту функцию, мне нужно смоделировать множество функций очень нетривиальным способом. Есть ли способ кратко издеваться над всеми вещами, связанными с os/os.path, с заданным списком файлов? Что-то вроде «mock_subdir(example_in_tar_gz):» или с каким-то DSL для описания фиктивной структуры дерева каталогов.

Интересующая функция:

def gather_tests(path):
    if os.path.isdir(path):
        filelist = [os.path.join(path, f) for f in os.listdir(path)]
        filelist.sort()
        all_files = map(gather_tests, filelist)
        return filter(None, all_files)
    elif os.path.isfile(path) and os.access(path, os.X_OK):
        return path
    else:
        return None

Спасибо.


person George Shuklin    schedule 12.12.2016    source источник


Ответы (1)


Вы можете создать временный каталог с помощью фиксатора pytest tmpdir. Это будет проще, чем издеваться над всеми функциями.

Или, если вы действительно хотите имитировать функции, вам нужно только имитировать: isdir, listdir, isfile и доступ:

with mock.patch('module.isdir') as mock_isdir, \
        mock.patch('module.listdir') as mock_listdir, \
        mock.patch('module.iffile') as mock_isfile, \
        mock.patch('module.access') as mock_access:
    mock_isdir.return_value = True
    mock_listdir.return_value = ['file1', 'file2']
    mock_isfile.return_value = True
    mock_access.return_value = True
person cyprieng    schedule 12.12.2016