Запустите python unittest в контексте определенной директории - PullRequest
0 голосов
/ 20 октября 2018

В моем приложении на Python я открываю mp3-файлы с относительными путями, откуда была запущена программа.Для простоты я сделал минимальное воспроизведение проблемы, которая возникла в моем проекте здесь .

В принципе, у меня есть такая структура:

src
└─ main.py
test
└─ test_main.py

В main.py у меня есть простая функция, которая печатает и возвращает текущий рабочий каталог:

def get_cwd() -> str:
    directory = os.path.basename(os.getcwd())
    print('Current directory =', directory)
    return directory

Так что, если я cd в папку src и запусту python main.py я вижу:

Current directory = src

Это желаемое поведение, так как в моей программе пути к файлам mp3 относятся к src.

Проблема возникает, когда я пытаюсь написать тесты.Кажется, я не могу пройти такой тест, независимо от того, что я передаю --start-directory и --top-level-directory:

def test_get_cwd(self):
    print('testing get_cwd()')
    current_dir = get_cwd()
    self.assertIsNotNone(current_dir)
    self.assertEqual(current_dir, 'src')

Вопрос: Как мне запуститьмои тесты, как если бы они выполнялись в контексте определенного каталога, если они сохранены в другом каталоге?

Ограничения:

  • тесты должны импортироваться с использованием абсолютных путей, как вмой пример: from src.main import get_cwd

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Существует функция os для изменения каталога, попробуйте добавить os.chdir('src') к вашему тесту.

import unittest
import os

from src.main import get_cwd


class TestMain(unittest.TestCase):

    def test_get_cwd(self):
        os.chdir('src')
        print('testing get_cwd()')
        current_dir = get_cwd()
        self.assertIsNotNone(current_dir)
        self.assertEqual(current_dir, 'src')
0 голосов
/ 20 октября 2018

Можно указать макет значение, заданное os.path.basename с возвращаемым значением "src"

import unittest
from mock import patch

from src.main import get_cwd


class TestMain(unittest.TestCase):

    @patch('os.path.basename')
    def test_get_cwd(self, basename):
        basename.return_value = "src"
        print('testing get_cwd()')
        current_dir = get_cwd()
        self.assertIsNotNone(current_dir)
        self.assertEqual(current_dir, 'src')
...