使用 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 raised
但 print()
命令打印 <Result ValueError('Please specify an age!',)>
: 这是我想要什么!
我怎样才能通过这个测试?
如您所见,CliRunner
不会引发异常,但会 return 在结果对象 (documentation) 中引发异常。
所以不要使用 assertRaises
检查 isinstance(result.exception, ValueError)
.
我需要对命令行函数中提出的断言进行单元测试。
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 raised
但 print()
命令打印 <Result ValueError('Please specify an age!',)>
: 这是我想要什么!
我怎样才能通过这个测试?
如您所见,CliRunner
不会引发异常,但会 return 在结果对象 (documentation) 中引发异常。
所以不要使用 assertRaises
检查 isinstance(result.exception, ValueError)
.