Angenommen, ich habe eine einfache Anwendung, die Zeilen von stdin liest und sie einfach auf stdout zurückgibt. Zum Beispiel:Wie kann ich einen Go-Test schreiben, der in stdin schreibt?
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("> ")
bytes, _, err := reader.ReadLine()
if err == io.EOF {
os.Exit(0)
}
fmt.Println(string(bytes))
}
}
Ich möchte einen Testfall schreiben, die auf stdin schreibt und vergleicht dann den Ausgang mit dem Eingang. Zum Beispiel:
package main
import (
"bufio"
"io"
"os"
"os/exec"
"testing"
)
func TestInput(t *testing.T) {
subproc := exec.Command(os.Args[0])
stdin, _ := subproc.StdinPipe()
stdout, _ := subproc.StdoutPipe()
defer stdin.Close()
input := "abc\n"
subproc.Start()
io.WriteString(stdin, input)
reader := bufio.NewReader(stdout)
bytes, _, _ := reader.ReadLine()
output := string(bytes)
if input != output {
t.Errorf("Wanted: %v, Got: %v", input, output)
}
subproc.Wait()
}
go test -v
Laufen gibt mir folgendes:
=== RUN TestInput
--- FAIL: TestInput (3.32s)
echo_test.go:25: Wanted: abc
, Got: --- FAIL: TestInput (3.32s)
FAIL
exit status 1
ich offensichtlich etwas falsch hier tue. Wie sollte ich diese Art von Code testen?
Ich habe das ">" aus meiner Ausgabe entfernt und Ihre TestInput-Funktion verwendet. Ich erhalte eine Reihe von etwa 100 Wiederholungsfehler, die wie folgt aussehen: === RUN TestInput --- FAIL: TestInput (5.17s) \t echo_test.go: 36: Gesucht: abc \t \t, Got: --- FAIL: TestInput (5.15s) \t \t \t echo_test.go: 36: gewünscht: abc \t \t \t \t, Got: --- FAIL: TestInput (5.13s) \t \t \t \t \t echo_test.go : 36: Gesucht: abc ... und so weiter. –
Es funktioniert gut für mich, wenn Sie das ">" entfernen. Haben Sie den richtigen Befehl zum Ausführen angegeben? –
Ich habe den Befehl in os.Args [0] geändert. –