Как создать unittests для python prompt toolkit?

Я хочу создать unittests для моего интерфейса командной строки с помощью Python prompt-toolkit (https://github.com/jonathanslenders/python-prompt-toolkit).

  • Как я могу эмулировать взаимодействие пользователя с подсказкой-подсказкой?
  • Есть ли наилучшая практика для этих unittests?

Пример кода:

from os import path
from prompt_toolkit import prompt

def csv():
    csv_path = prompt('\nselect csv> ')
    full_path = path.abspath(csv_path)
    return full_path

Ответ 1

Вы можете mock вызвать приглашения.

app_file

from prompt_toolkit import prompt

def word():
    result = prompt('type a word')
    return result

test_app_file

import unittest
from app import word
from mock import patch

class TestAnswer(unittest.TestCase):
    def test_yes(self):
        with patch('app.prompt', return_value='Python') as prompt:
            self.assertEqual(word(), 'Python')
            prompt.assert_called_once_with('type a word')

if __name__ == '__main__':
    unittest.main()

Просто обратите внимание на то, что вы должны высмеивать приглашение от app.py, а не от prompt_toolkit, потому что вы хотите перехватить вызов из файла.

В соответствии с docstring модулем:

Если вы используете эту библиотеку для получения некоторого ввода от пользователя (как чистая замена Python для readline GNU), вероятно, для 90% случаев использования, функция: func: .prompt - это все, что вам нужно.

И как метод docstring говорит:

Получите ввод от пользователя и верните его.     Это оболочка вокруг множества функций prompt_toolkit и может быть заменой raw_input. (или GNU readline.)

Следуя Начало работы из проекта:

>>> from prompt_toolkit import prompt
>>> answer = prompt('Give me some input: ')
Give me some input: Hello World
>>> print(answer)
'Hello World'
>>> type(answer)
<class 'str'>

Как метод prompt возвращает тип строки, вы можете использовать mock.return_value для имитации интеграции пользователя с вашим приложением.