python-3.x - 如何测试具有多个输入调用的循环?
问题描述
我正在尝试测试一个依赖多个用户输入的函数来返回一些值。
我已经在这里寻找了多个答案,但没有一个能够解决我的问题。我看到了参数化、模拟和猴子补丁的东西,但没有任何帮助。我想很多是因为我没有清楚地理解所做事情背后的概念,我无法适应我的问题。我看到了为此使用外部文件的建议,但我不会依赖它。我正在尝试使用 pytest 和 python 3.7.3
我要测试的功能是这样的
def function():
usr_input = input('please enter a number: ')
while True:
if int(usr_input) < 5:
usr_input = input('please, enter a value less then 5: ')
else:
break
return usr_input
我想知道当插入的值无效时如何传递两个输入值来测试函数。示例:发送值 6 和 2,断言期望值 2 并通过测试。我的其他测试如下所示:
def test_input(monkeypatch):
monkeypatch.setattr('builtins.input', lambda x: 6)
test = function()
assert test == 2
但是,对于这种情况,它们会循环。仅使用参数化或其他简单代码可以做到这一点吗?
编辑
我在我的“if”中添加了一个 int(),正如 wim 在接受的答案中指出的那样,只是为了防止给未来的读者造成任何混淆。我假设演员阵容是可能的。
解决方案
这里有两个问题,您需要将输入转换为数字,否则比较将失败,将字符串与数字进行比较:usr_input < 5
。请注意,realinput
永远不会返回一个数字,只会返回一个字符串。
一旦你清除了它,你可以input
使用一个可调用的monkeypatch,它可以在调用时返回不同的值:
def fake_input(the_prompt):
prompt_to_return_val = {
'please enter a number: ': '6',
'please, enter a value less then 5: ': '2',
}
val = prompt_to_return_val[the_prompt]
return val
def test_input(monkeypatch):
monkeypatch.setattr('builtins.input', fake_input)
test = function()
assert test == 2
如果你安装了插件pytest-mock
,你可以使用 mock API 更轻松地做到这一点:
def test_input(mocker):
mocker.patch('builtins.input', side_effect=["6", "2"])
test = function()
assert test == 2
推荐阅读
- html - 当我使用角度输入注册表时,我想根据年龄打印如果人是未成年人或主要或老年人
- progressive-web-apps - PWA 在桌面上下载,而不是在移动设备上
- form-recognizer - Azure 表单识别器。将 v1.0-preview 自定义模型迁移到 v2.0
- python-3.x - 如何在默认情况下激活 anaconda 中的环境?
- php - 防止 Intercom API 在发送消息时重写链接
- c# - 从多个字符串中删除最后一个空格之后的整个字符集
- python - 如何从我的 python 应用程序将用户名和密码存储在 SQLite 数据库中?
- c# - 使用 TAP 进行多任务处理
- xml - 计算父元素并在字符串 XSLT 2 中返回它们
- r - 为ggplot2中的每个图例分配不同的背景颜色