如何测试prompt命令?如何在t/文件中编写测试并响应prompt?
Raku交互式代码的测试方案
先看你提供的原代码:
my $x = prompt "Are you OK? "; say $x ~~ 'y' ?? "Great!" !! "Bummer"; use Test;
一、可编写的测试用例
针对这段逻辑,可覆盖以下测试场景:
- 输入小写
y时,验证输出为Great! - 输入非
y的内容(比如n、abc等任意字符串)时,验证输出为Bummer - 输入大写
Y时,验证输出为Bummer(原代码仅匹配小写y)
二、让测试响应prompt输入的方法
Raku的prompt默认读取标准输入,自动化测试时不需要手动输入,可通过mock prompt函数的方式预设输入值,同时捕获输出进行断言。以下是完整的测试文件示例:
use Test; # 辅助函数:捕获标准输出内容 sub capture_stdout(&code) { my $output; my $*OUT = class { method print($str) { $output ~= $str } }; code(); return $output; } # 测试输入'y'的场景 sub prompt($) { 'y' } my $output = capture_stdout { my $x = prompt "Are you OK? "; say $x ~~ 'y' ?? "Great!" !! "Bummer"; } is $output.chomp, "Great!", '输入小写y时输出正确'; # 测试输入'n'的场景 sub prompt($) { 'n' } $output = capture_stdout { my $x = prompt "Are you OK? "; say $x ~~ 'y' ?? "Great!" !! "Bummer"; } is $output.chomp, "Bummer", '输入n时输出正确'; # 测试输入大写Y的场景 sub prompt($) { 'Y' } $output = capture_stdout { my $x = prompt "Are you OK? "; say $x ~~ 'y' ?? "Great!" !! "Bummer"; } is $output.chomp, "Bummer", '输入大写Y时输出正确'; done-testing;
原理说明
- Mock
prompt函数:在每个测试场景中重新定义prompt,让它直接返回预设的输入值,替代原本的标准输入读取逻辑。 - 捕获标准输出:通过自定义的
capture_stdout函数,临时替换标准输出流,将代码运行时的输出内容保存到变量中,方便后续断言验证。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

