команда assert pytest была выполнена

1

У меня есть маршрут приложения django, который будет запускать команду pytest.main(), если выполняются некоторые условия:

def run_single_test(request, single_test_name):
    # get dict of test names, test paths
    test_dict = get_single_test_names()
    # check to see if test is in the dict
    if single_test_name in test_dict:
        for test_name,test_path in test_dict.items():
            # if testname is valid run associated test
            if test_name == single_test_name:
                os.chdir('/lib/tests/')
                run_test = pytest.main(['-v', '--json-report', test_path])
    else:
        return 'The requested test could not be found.'

Я хотел бы включить unit тест, который проверяет выполнение run_test.

Каков наилучший подход к этому? Мок и unittest новы для меня.

Я попытался возиться с stdout:

def test_run_single_test_flow_control(self):
        mock_get = patch('test_automation_app.views.get_single_test_names')
        mock_get = mock_get.start()
        mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}

        results = run_single_test('this-request', 'test_search')
        output = sys.stdout
        self.assertEqual(output, '-v --json-report folder/test_file.py::TestClass::test')

но это возвращает:

<_pytest.capture.EncodedFile object at XXXXXXXXXXXXXX>
  • 0
    Вы можете pytest.main и убедиться, что он был вызван с помощью Mock.assert_called впоследствии.
  • 0
    Я сделаю это, спасибо.
Показать ещё 2 комментария
Теги:
pytest

1 ответ

1
Лучший ответ

Вот два примера тестов, которые проверяют, что pytest.main вызывается, когда действительное имя теста передается и не вызывается иначе. Я также добавил в качестве примера несколько разных вызовов mock_pytest_main.assert_called; все они делают почти то же самое, с дополнительной проверкой на аргументы, переданные по вызову функции. Надеюсь, это поможет вам написать более сложные тесты!

from unittest.mock import patch
from test_automation_app.views import run_single_test


def test_pytest_invoked_when_test_name_valid():
    with patch('pytest.main') as mock_pytest_main, patch('test_automation_app.views.get_single_test_names') as mock_get:
        mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
        results = run_single_test('this-request', 'test_search')
        mock_pytest_main.assert_called()
        mock_pytest_main.assert_called_with(['-v', '--json-report', 'folder/test_file.py::TestClass::test'])
        mock_pytest_main.assert_called_once()
        mock_pytest_main.assert_called_once_with(['-v', '--json-report', 'folder/test_file.py::TestClass::test'])


def test_pytest_not_invoked_when_test_name_invalid():
    with patch('pytest.main') as mock_pytest_main, patch('test_automation_app.views.get_single_test_names') as mock_get:
        mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
        results = run_single_test('this-request', 'test_non_existent')
        mock_pytest_main.assert_not_called()
  • 0
    Большое спасибо, теперь это имеет смысл. Ценю помощь!
  • 0
    Хорошо, рад, что смог помочь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню