使用pytest,如何与os.listdir一起模拟pathlib的Path.isdir()函数

时间:2019-12-16 10:50:58

标签: python-3.x pytest pytest-mock

我正在尝试为此功能编写pytest测试。 它会查找名为一天的文件夹。

from settings import SCHEDULE
from pathlib import Path
import os
import datetime

def get_schedule_dates():
    schedule_dates = []
    for dir in os.listdir(SCHEDULE):  # schedule is a path to a lot of directories
        if Path(SCHEDULE, dir).is_dir():
            try:
                _ = datetime.datetime.strptime(dir, '%Y-%m-%d')
                schedule_dates.append(dir)
            except ValueError:
                pass
    return schedule_dates

模拟os.listdir可以正常工作。 (当我关闭isdir检查时)

from mymod import mycode as asc
import mock


def test_get_schedule_dates():
    with mock.patch('os.listdir', return_value=['2019-09-15', 'temp']):
        result = asc.get_schedule_dates()
        assert '2019-09-15' in result
        assert 'temp' not in result

同时模拟pathlib的路径不起作用:

def test_get_schedule_dates():
    with (mock.patch('os.listdir', return_value=['2019-09-15', 'temp']),
          mock.patch('pathlib.Path.isdir', return_value=True)):
        result = asc.get_schedule_dates()
        assert '2019-09-15' in result
        assert 'temp' not in result

我得到了错误:

E             AttributeError: __enter__

如何在同一调用中模拟listdir和Path?

1 个答案:

答案 0 :(得分:0)

看起来每个with语句只能使用一个模拟, 测试这种方式有效。

def test_get_schedule_dates():
    with mock.patch('os.listdir', return_value=['2019-09-15', 'temp']):
        with mock.patch('pathlib.Path.is_dir', return_value=True):
            result = asc.get_schedule_dates()
            assert '2019-09-15' in result
            assert 'temp' not in result