Как издеваться над os.sep для os.path.join
У меня есть тест для функции, которая находит файлы и возвращает список путей. Это выглядит примерно так:
def find(self):
files = sorted(os.listdir(self.path))
for filename in files:
full_path = os.path.join(self.path, filename)
yield full_path
где self.path
либо использует прямую косую черту в Linux или обратную косую черту в Windows.
Я хочу проверить, использует ли функция правильный каталог + файл при присоединении к ним. Итак, мой тест выглядит так:
def test_find(self):
test_list = ['users.csv', 'products.csv']
with patch('os.listdir', return_value=test_list),\
patch('platform.system', return_value='Windows'),\
patch('os.path.exists', return_value=True):
with patch('os.sep', new_callable=PropertyMock, return_value='\\') as mock:
finder = ImportFinder()
found_files = list(finder.find())
self.assertEqual(['C:\\test\\import\\products.csv', 'C:\\test\\import\\users.csv'], found_files)
но os.path.join
все еще использует /
так как я запускаю тест на машине с Linux. found_files
тогда выглядит ['C:\\test\\import/products.csv', 'C:\\test\\import/users.csv']
Теперь я мог бы избежать этого, используя side_effect
и функция, которая будет соединять пути вручную вместо os.path.join
,
Но мой вопрос: почему это не работает так, как я хотел?