使用 Click 在命令行应用程序中进行单元测试断言

Unit testing assertions in command line applications with Click

我需要对命令行函数中提出的断言进行单元测试。

click 提供测试命令行应用程序的功能,unittest 提供测试断言是否被引发的功能。我的问题是将两者结合起来。

我正在测试的内容与下面的代码类似。有一个带有命令行参数的函数和一个选项,如果该参数是某个值,则必须指定该选项。它在精神上类似于这个例子:

import unittest
import click
from click.testing import CliRunner

@click.command()
@click.argument('name')
@click.option('--age')
def hello(name, age):
    if name == 'Peter' and not age:
        raise ValueError('Please specify an age!')
    click.echo('Hello %s!' % name)


class TestClickAssertion(unittest.TestCase):
    def test_hello_world(self):
        with self.assertRaises(ValueError):
            runner = CliRunner()
            result = runner.invoke(hello, ['Peter'])
            print(result)

我遇到的问题是 运行 unittest in pycharm,我得到一个 AssertionError: ValueError not raisedprint() 命令打印 <Result ValueError('Please specify an age!',)>: 这是我想要什么!

我怎样才能通过这个测试?

如您所见,CliRunner 不会引发异常,但会 return 在结果对象 (documentation) 中引发异常。

所以不要使用 assertRaises 检查 isinstance(result.exception, ValueError).