为什么在这个 python-inquirer 脚本中覆盖率不是 100%?
Why is coverage not 100% in this python-inquirer script?
我有一个简单的方法可以接收交易列表(描述和 ID)和 return selected 交易的 ID。如果 none 是 selected,您需要确认。我使用 python-inquirer 来做到这一点:
# question.py
from typing import List, Tuple
import inquirer
def select_trades(trades: List[Tuple[str, int]]) -> List[int]:
while True:
selection = inquirer.prompt(
[
inquirer.Checkbox(
"trades",
message=(
"Select auction trades? "
"(press space to select and enter to finish)"
),
choices=trades,
)
]
)["trades"]
if len(selection) == 0:
answer = inquirer.prompt(
[
inquirer.List(
"",
message="No trade selected.\nDo you confirm?",
choices=["Yes", "No"],
)
]
)[""]
if answer == "Yes":
return []
else:
break
return selection
我做了2个测试用例。一个你selectnone,不确认,再selectnone再确认。另一种情况你 select id 1:
# test_question.py
from unittest.mock import patch
from question import select_trades
@patch(
"inquirer.prompt",
side_effect=[{"trades": []}, {"": "No"}, {"trades": []}, {"": "Yes"}],
)
def test_select_trades_empty(mock_inquirer_prompt) -> None:
trades = [("trade 1", 0), ("trade 2", 1)]
assert select_trades(trades) == []
@patch("inquirer.prompt", return_value={"trades": [1]})
def test_select_trades_some_selected(mock_inquirer_prompt) -> None:
trades = [("trade 1", 0), ("trade 2", 1)]
assert select_trades(trades) == [1]
出于某种原因,覆盖率是说 break
没有被覆盖,但是在第二个测试用例中,while True
中断并且 return 测试的预期值.我不明白为什么在这种情况下它没有 100% 涵盖。
由于Python跳转优化,导致Coverage.py无法看到此行被覆盖(https://github.com/nedbat/coveragepy/issues/198)。
我有一个简单的方法可以接收交易列表(描述和 ID)和 return selected 交易的 ID。如果 none 是 selected,您需要确认。我使用 python-inquirer 来做到这一点:
# question.py
from typing import List, Tuple
import inquirer
def select_trades(trades: List[Tuple[str, int]]) -> List[int]:
while True:
selection = inquirer.prompt(
[
inquirer.Checkbox(
"trades",
message=(
"Select auction trades? "
"(press space to select and enter to finish)"
),
choices=trades,
)
]
)["trades"]
if len(selection) == 0:
answer = inquirer.prompt(
[
inquirer.List(
"",
message="No trade selected.\nDo you confirm?",
choices=["Yes", "No"],
)
]
)[""]
if answer == "Yes":
return []
else:
break
return selection
我做了2个测试用例。一个你selectnone,不确认,再selectnone再确认。另一种情况你 select id 1:
# test_question.py
from unittest.mock import patch
from question import select_trades
@patch(
"inquirer.prompt",
side_effect=[{"trades": []}, {"": "No"}, {"trades": []}, {"": "Yes"}],
)
def test_select_trades_empty(mock_inquirer_prompt) -> None:
trades = [("trade 1", 0), ("trade 2", 1)]
assert select_trades(trades) == []
@patch("inquirer.prompt", return_value={"trades": [1]})
def test_select_trades_some_selected(mock_inquirer_prompt) -> None:
trades = [("trade 1", 0), ("trade 2", 1)]
assert select_trades(trades) == [1]
出于某种原因,覆盖率是说 break
没有被覆盖,但是在第二个测试用例中,while True
中断并且 return 测试的预期值.我不明白为什么在这种情况下它没有 100% 涵盖。
由于Python跳转优化,导致Coverage.py无法看到此行被覆盖(https://github.com/nedbat/coveragepy/issues/198)。