gpt4 book ai didi

testing - 模拟 bufio.NewScanner 的标准输出流

转载 作者:IT王子 更新时间:2023-10-29 01:51:06 27 4
gpt4 key购买 nike

我想为我使用 bufio.NewScannerScan() 的实用函数编写测试。我通常在 stdout 上使用它,现在我想模拟一小段流,我可以在其中返回一些静态字符串以进行测试。

bufio.NewScanner(r io.Reader) 需要一个 Reader 但它只需要一个 read 方法。通过阅读源代码,我无法弄清楚它从哪个缓冲区读取或者它是如何传入的。

我怎样才能以简洁明了的方式模拟它?

最佳答案

要简单地测试您的代码,您可以使用@Sven 的回答。

要了解用于测试的简单 io.Reader,请考虑以下示例:

type R struct {
Data string
done bool
}

func (r *R) Read(p []byte) (n int, err error) {
copy(p, []byte(r.Data))
if r.done {
return 0, io.EOF
}
r.done = true
return len([]byte(r.Data)), nil
}

R 是一种自定义测试类型,它通过具有 Read 方法来实现 io.Reader 接口(interface)。因此,它将被 NewScanner 接受。它可以用作:

func NewR(data string) *R {
return &R{data, false}
}

r := NewR("Test\nmessage\n")
scanner := bufio.NewScanner(r)

for scanner.Scan() {
fmt.Printf("Line: %s\n", scanner.Text())
}

输出:

Line: Test 
Line: message

R 类型和它的Read 方法都被定义为一个简单的字节源。 Scan 调用其读取器(NewScanner 的输入)Read 方法,直到它收到 EOF 或错误。为简单起见,RRead 方法在第一次调用时将其数据复制到调用者的缓冲区 (p) 并返回一个 EOF 用于任何后续调用。

请注意,\n 处的行的实际拆分是由 scanner.Scan 而不是 r.Read 完成的。

您可以修改上面的 Read 方法以根据您的要求获得自定义行为。

工作示例:https://play.golang.org/p/zqDoQDIE93

关于testing - 模拟 bufio.NewScanner 的标准输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com