Replit单元测试中如何测试含用户输入的Python函数?
在Replit中测试含用户输入的Python函数
问题原因
Replit的单元测试环境是非交互式的,当函数调用input()时,无法从标准输入(sys.stdin)获取内容,因此抛出RuntimeError: input(): lost sys.stdin错误。
解决方案
方法1:重构函数,解耦输入逻辑(推荐)
把函数内部的输入获取逻辑抽离,让函数接收外部传入的参数,既保留原函数的交互式使用场景,又方便单元测试直接传参。
修改后的函数:
def play(n, num=None): if num is None: num = int(input("Enter the amount")) # 保留原有的业务逻辑(比如用n和num判断返回值的代码) return num
对应的测试代码:
self.assertTrue(play(10, num=5) < 6)
方法2:使用mock模拟输入
如果不想修改原函数,可以用Python标准库unittest.mock模块替换input()的返回值,让函数在测试时拿到预设的输入内容。
测试代码示例:
from unittest.mock import patch import unittest class TestPlayFunction(unittest.TestCase): @patch('builtins.input', return_value='5') def test_play(self, mock_input): # 模拟input()返回'5',转换为int后是5 self.assertTrue(play(10) < 6) if __name__ == '__main__': unittest.main()
内容的提问来源于stack exchange,提问作者Chanya Subasingha
相关产品推荐
相关产品推荐

