2016-07-25 6 views
0

bufio.NewScannerScan()を使用するユーティリティー関数のテストを書いてみたいと思います。私は通常それをstdoutで使用していますが、テスト用に静的な文字列を返すことができる短いストリームをシミュレートしたいと思います。bufio.NewScannerのstdoutストリームを模擬してください

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 
} 

RRead方法を持っていることによってio.Readerインターフェイスを実装のカスタム・テスト・タイプです。従って、それはNewScannerによって受け入れられるでしょう。バイトの単純な供給源として機能するように定義されている

Line: Test 
Line: message 

タイプR両方とそのRead方法:

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()) 
} 

出力:として使用することができます。 Scanは、EOFまたはエラーが発生するまで、リーダー(NewScannerへの入力)Readメソッドを呼び出します。簡単にするため、RReadメソッドは、そのデータを最初の呼び出しで呼び出し元のバッファ(p)にコピーし、それ以降の呼び出しではEOFを返します。

\nの実際の回線分割は、scanner.Scanで行われ、r.Readでは行われません。

上記のReadメソッドを変更して、要件に応じてカスタム動作を得ることができます。

の作業例:https://play.golang.org/p/zqDoQDIE93

+0

詳細な説明をいただきありがとうございます。 – Mahoni

2

bytes.Bufferio.Readerの機能を実装しているため、bytes.Bufferを使用できます。

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()) 
    } 
} 
関連する問題