2016-07-25 10 views
0

Ich möchte einen Test für eine Dienstprogrammfunktion schreiben, wo ich bufio.NewScanner und Scan() verwenden. Ich benutze es normalerweise auf stdout und jetzt möchte ich ein kurzes Stück Strom simulieren, wo ich eine statische Schnur für den Zweck des Tests zurückgeben kann.Mock ein stdout Stream für bufio.NewScanner

bufio.NewScanner(r io.Reader) dauert eine Reader, aber das erfordert nur eine read Methode. Durch das Lesen des Quellcodes konnte ich nicht herausfinden, aus welchem ​​Puffer er gelesen wird oder wie er hineingelangt.

Wie kann ich das kurz und prägnant darstellen?

+0

Was meinen Sie auf '' stdout' eine bufio.NewScanner' unter Verwendung? Erstellen Sie einen neuen Scanner mit 'stdout'? – abhink

+0

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

Antwort

1

einfach, um Ihren Code zu testen Sie @ Sven Antwort verwenden können.

Um eine Vorstellung von einer einfachen io.Reader zum Testen bekommen, sollten Sie unter Beispiel:

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 ist ein benutzerdefinierter Testtyp, indem er eine Read Methode eine io.Reader Schnittstelle ist zu implementieren. Somit wird es von NewScanner angenommen.

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

Output::

Line: Test 
Line: message 

sowohl die Art und seine RRead Verfahren definiert wurden, als eine einfache Quelle von Bytes arbeiten Es kann als verwendet werden. Scan ruft seine Reader (Eingang NewScanner) Read Methode, bis es eine EOF oder einen Fehler erhält. Zur Vereinfachung kopiert die R Methode Read ihre Daten beim ersten Aufruf in den Puffer des Aufrufers (p) und gibt bei weiteren Aufrufen eine EOF zurück.

Beachten Sie, dass das tatsächliche Aufteilen der Zeilen bei \n durch scanner.Scan und nicht r.Read erfolgt.

Sie können die obige Methode Read ändern, um benutzerdefiniertes Verhalten gemäß Ihren Anforderungen zu erhalten.

Arbeitsbeispiel: https://play.golang.org/p/zqDoQDIE93

+0

Danke für die detaillierte Erklärung, das macht jetzt sehr viel Sinn! – Mahoni

2

Sie können bytes.Buffer verwenden, da es die io.Reader Funktionen implementiert.

Beispielhttps://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()) 
    } 
}