2016-07-25 95 views
0

一个标准输出流,我想写的,我用bufio.NewScannerScan()效用函数的测试。我通常在stdout上使用它,现在我想模拟一小段流,以便为测试目的返回一些静态字符串。模拟为bufio.NewScanner

bufio.NewScanner(r io.Reader)需要Reader但只需要一个read方法。通过阅读源代码,我无法弄清楚从缓存读取或如何在被传递。

我怎么能嘲笑,在一个简短的方式吗?

+0

你说的对'stdout'使用'bufio.NewScanner'是什么意思?你在用'stdout'创建一个新的扫描器吗? – abhink

+0

@abhink是'bufio.NewScanner(os.Stdout)' – Mahoni

回答

1

要简单地测试你的代码,你可以使用@斯文的答案。

要得到一个简单的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接口的自定义测试类型。因此,它将被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调用它的读者(输入NewScannerRead方法,直到它得到一个EOF或错误。为简单起见,RRead方法复制其数据到在其第一呼叫呼叫者的缓冲液(p),并返回的任何后续呼叫的EOF

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

您可以修改上面的Read方法来获得定制的行为按您的要求。

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

+0

感谢您的详细解释,这使得现在有很多意义! – Mahoni

2

您可以使用bytes.Buffer,因为它实现了io.Reader功能。

https://play.golang.org/p/gjjMmT3SzD

package main 

import (
    "bufio" 
    "bytes" 
    "fmt" 
) 

func main() { 
    buf := bytes.NewBufferString("foo\nbar") 
    scanner := bufio.NewScanner(buf) 
    for scanner.Scan() { 
     fmt.Println(scanner.Text()) 
    } 
}