Python CLI模拟动态输入问题



我正在使用python CLI,在尝试测试多个模拟副作用时遇到了问题。我搜索过谷歌、stackexchange等,但似乎无法使用任何这些信息来使我的代码按预期运行,真的需要额外的眼睛。

正在使用的技术:

  • python 3.9.5
  • 打字机
  • 简单术语菜单
  • pytest
  • pytest模拟

操作代码按预期执行,但测试场景没有。下面是一些伪代码:src/endpoints/cli.py

@cli.command()
def ls(
env: Optional[str] = typer.Option(None, '--env', prompt=False),
tool: Optional[str] = typer.Option(None, '--tool', prompt=False)
results = get_results(env, tool)
typer.echo(f"{str(results).rstrip()}")
return str(results).rstrip()
def get_results(env, tool):
if env is None:
typer.echo("Please select an environment")
env_select_menu = TerminalMenu(
list_envs()
)
env_entry_index = env_select_menu.show()
env = env_select_menu.chosen.menu_entry
logging.debug(f"printing env: {env}")
typer.echo(f"> {env}")
if tool is None:
typer.echo("Please select a tool")
tool_select_menu = TerminalMenu(
list_tools()
)
tool_entry_index = tool_select_menu.show()
tool = tool_select_menu.chosen.menu_entry
logging.debug(f"printing tool: {tool}")
typer.echo(f"> {tool}")

test_cli.py

from typer.testing import CliRunner
from src.endpoints.cli import cli
import pytest
import logging
@pytest.mark.parameterize(
"params,response",
[
(None, "Please select a domain")
]
)
def test_results(mocker, params, response, tool_results):
if params:
pass
else:
mock_terminal = mocker.patch("src.endpoints.cli.TerminalMenu")
mock_terminal().chosen_menu_entry = 'test'
runner = CliRunner()
result = runner.invoke(cli, ['ls'])
logging.debug(mock_terminal.mock_calls)

assert "Please select an environment" in result.output
assert "Please select a tool" in result.output

结果输出:

DEBUG: root: printing env: test
DEBUG: root: env is test
> test
Please select a tool
DEBUG: root:[call(), call(['test']), call().__str__(), call().show()]

预期产出:与上面相同,但第二次调用TerminalMenu((.chosen_menu_entry时,它将再次以"test"响应。理想情况下,我希望使用side_effect来返回不同的结果。我尝试过mock_terminal().chosen_menu_entry.side_effect = ['test', 'test-tool']的不同变体,但认为在使用side_effect尝试不同的值之前,我应该解决模拟响应不返回相同值的问题。有人看到我做错了什么吗?为什么第二次调用TerminalMenu时没有使用return_value?测试通过了,但看起来实际上没有对tool_select_menu(这是对TerminalMenu的第二次调用(做任何操作。

提前感谢您的任何见解。

我解决了这个问题。我能够使用side_effect和PropertyMock的组合来解决测试问题。

最新更新