Referrence pallets/click#737
import functools
import pytest
@pytest.fixture
def cli():
"""Yield a click.testing.CliRunner to invoke the CLI."""
class_ = CliRunner
def invoke_wrapper(f):
"""Augment CliRunner.invoke to emit its output to stdout.
This enables pytest to show the output in its logs on test
failures.
"""
@functools.wraps(f)
def wrapper(*args, **kwargs):
echo = kwargs.pop('echo', False)
result = f(*args, **kwargs)
if echo is True:
sys.stdout.write(result.output)
return result
return wrapper
class_.invoke = invoke_wrapper(class_.invoke)
cli_runner = class_()
yield cli_runner
Test case
def test_methods(self, cli):
# enable echo=True
result = cli.invoke('test-click-command', echo=True)
assert 'OK in result.output
Using subprocess instead of CliRunner
def test_methods(self, cli):
commands = ['test-click-command']
return_code = sys.exit(subprocess.call(commands))
assert return_code == self.SUCCESS_CODE