如何在 Python 中对需要活动单击上下文的函数进行单元测试
How to unit test function that requires an active Click context in Python
我正在使用命令行 shell,我正在尝试测试一些解析命令参数的函数。
parser.py:
import shlex
import click
def process_cmd(args, called_self=False):
result = args
# Replace aliases
if not called_self:
aliases = click.get_current_context().obj.config['ALIASES']
if result[0] in aliases:
substitution = process_cmd(split_args(aliases[result[0]]), True)
if len(result) == 1:
result = substitution
else:
result = substitution + result[1:]
return result
def split_pipeline(args):
cmd = []
for arg in args:
if arg == '|':
yield process_cmd(cmd)
cmd = []
else:
cmd.append(arg)
# yield the last part of the pipeline
yield process_cmd(cmd)
这是我为split_pipeline
写的单元测试:
import parser
def test_pipeline():
args = ['1', '2', '|', '3', '|', '4']
result = [i for i in parser.split_pipeline(args)]
assert result == [['1', '2'], ['3'], ['4']]
当此单元测试为 运行 时,我收到一条错误消息,指出没有活动的点击上下文。
点击库 Context()
对象可用作 Python 上下文。所以要在测试中设置一个 active 上下文,你可以简单地做:
with ctx:
....
要创建一个 Context
进行测试,您可以像这样实例化一个:
ctx = click.Context(a_click_command, obj=my_context_object)
测试代码:
import click
def process_cmd():
click.echo(click.get_current_context().obj['prop'])
def test_with_context():
ctx = click.Context(click.Command('cmd'), obj={'prop': 'A Context'})
with ctx:
process_cmd()
test_with_context()
结果:
A Context
我正在使用命令行 shell,我正在尝试测试一些解析命令参数的函数。
parser.py:
import shlex
import click
def process_cmd(args, called_self=False):
result = args
# Replace aliases
if not called_self:
aliases = click.get_current_context().obj.config['ALIASES']
if result[0] in aliases:
substitution = process_cmd(split_args(aliases[result[0]]), True)
if len(result) == 1:
result = substitution
else:
result = substitution + result[1:]
return result
def split_pipeline(args):
cmd = []
for arg in args:
if arg == '|':
yield process_cmd(cmd)
cmd = []
else:
cmd.append(arg)
# yield the last part of the pipeline
yield process_cmd(cmd)
这是我为split_pipeline
写的单元测试:
import parser
def test_pipeline():
args = ['1', '2', '|', '3', '|', '4']
result = [i for i in parser.split_pipeline(args)]
assert result == [['1', '2'], ['3'], ['4']]
当此单元测试为 运行 时,我收到一条错误消息,指出没有活动的点击上下文。
点击库 Context()
对象可用作 Python 上下文。所以要在测试中设置一个 active 上下文,你可以简单地做:
with ctx:
....
要创建一个 Context
进行测试,您可以像这样实例化一个:
ctx = click.Context(a_click_command, obj=my_context_object)
测试代码:
import click
def process_cmd():
click.echo(click.get_current_context().obj['prop'])
def test_with_context():
ctx = click.Context(click.Command('cmd'), obj={'prop': 'A Context'})
with ctx:
process_cmd()
test_with_context()
结果:
A Context