我正在尝试在测试用例中获取键盘输入,基本上我遵循了这个例子,
https://www.socketloop.com/tutorials/golang-read-input-from-console-line
在我的单元测试用例中,它总是导致“EOF”错误,而没有让我有机会从键盘输入。
Go单元测试环境有什么特别之处吗?或者我应该研究另一个更好的选择?
我的代码看起来像,
func (o *Player) consoleReadLn() (line string) {
consoleReader := bufio.NewReader(os.Stdin)
line, err := consoleReader.ReadString('\n')
if err != nil {
panic(err.Error()) // it just panic: EOF
}
return
}
答案 0 :(得分:0)
首先,您的代码应更正为:
import "testing/iotest"
func (o *Player) consoleReadLn() string {
consoleReader := bufio.NewReader(os.Stdin)
s := ""
for {
s1, err := consoleReader.ReadString('\n')
if err == io.EOF {
break
}
if err != nil && err != iotest.ErrTimeout {
panic("GetLines: " + err.Error())
}
s += s1
}
return s
}
因为您期望使用\n
作为一行字符串的分隔符,所以它将返回带有EOF
的数据,在Unix OS中为\n
,请参阅godoc bufio#Reader.ReadString :
ReadString读取直到输入中第一次出现delim,返回包含数据的字符串,包括分隔符。如果ReadString在找到分隔符之前遇到错误,它将返回错误之前读取的数据和错误本身(通常是io.EOF)。当且仅当返回的数据不以delim结尾时,ReadString才返回err!= nil。对于简单的用途,扫描仪可能更方便。
但是,我建议您阅读此答案Read from initial stdin in GO?
其次,很难在STDIN
等单元测试环境中测试go test
。我发现this mail说:
新
go test
运行连接标准输入的测试 到/dev/null
。
所以我认为很难直接通过os.Stdin
测试go test
,例如,以下代码确认在运行命令{{{{}}时根本不会读取/dev/stdin
1}}:
echo this is stdin | go test ./