2016-07-25 96 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()) 
    } 
}