Go测试用例中的Readline失败

时间:2015-08-08 12:17:24

标签: go

我正在尝试在测试用例中获取键盘输入,基本上我遵循了这个例子,

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
}

1 个答案:

答案 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 ./