Unittest для модуля щелчка - PullRequest
       27

Unittest для модуля щелчка

0 голосов
/ 08 ноября 2018

Я написал простую утилиту командной строки, которая принимает текстовый файл и ищет в нем заданное слово, используя модуль click.

sfind.py

import click
@click.command()
@click.option('--name', prompt='Word or string')
@click.option('--filename', default='file.txt', prompt='file name')
@click.option('--param', default=1, prompt="Use 1 for save line and 2 for word, default: ")
def find(name, filename, param):
    """Simple program that find  word or string at text file and put it in new"""
    try:
        with open(filename) as f, open('result.txt', 'w') as f2:
            count = 0
            for line in f:
                if name in line:
                    if param == 1:
                        f2.write(line + '\n')
                    elif param == 2:
                        f2.write(name + '\n')
                    count += 1
            print("Find: {} sample".format(count))
            return count
    except FileNotFoundError:
        print('WARNING! ' + 'File: ' + filename + ' not found')


if __name__ == '__main__':
    find()

Теперь мне нужно написать тест с использованием unittest (требуется использование unittest).

test_sfind.py

import unittest
import sfind

class SfindTest(unittest.TestCase):
    def test_sfind(self):
        self.assertEqual(sfind.find(), 4)


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

Когда я запускаю тест:

python -m unittest test_sfind.py

Я получаю ошибку

click.exceptions.UsageError: Получен неожиданный дополнительный аргумент (test_sfind.py)

Как я могу проверить эту команду щелчка?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы не можете просто вызвать команду щелчка, а затем ожидать ее возврата. Декораторы, применяемые для создания команды щелчка, значительно изменяют поведение функции. К счастью, инфраструктура кликов обеспечивает это с помощью класса CliRunner.

Ваша команда может быть проверена с помощью unittest примерно так:

import unittest
import sfind
from click.testing import CliRunner

class TestSfind(unittest.TestCase):

    def test_sfind(self):

        runner = CliRunner()
        result = runner.invoke(
            sfind.find, '--name url --filename good'.split(), input='2')
        self.assertEqual(0, result.exit_code)
        self.assertIn('Find: 3 sample', result.output)
...