2017-05-22 2 views
4

Ich habe diese Funktion, die den Fehler in einigen Fällen protokolliert:Wie überprüfe ich einen Log/Output im Go-Test?

func readByte(/*...*/){ 
    // ... 
    if err != nil { 
     fmt.Println("ERROR") 
     log.Print("Couldn't read first byte") 
     return 
    } 
    // ... 
} 

nun in der Testdatei, ich möchte den Ausgabefehler von dieser Funktion überprüfen:

c.Assert(OUTPUT, check.Matches, "teste") 

Wie kann ich das Protokoll? Ich habe versucht, einen Puffer zu setzen, aber es hat nicht funktioniert. Was ist der richtige Weg, um dieses Protokoll zu fangen, ohne meinen readByte Funktionscode zu ändern?

+1

Was hat nicht zu einem Puffer das Protokoll über das Schreiben? – JimB

+0

der Puffer ist leer. Das OUTPUT gibt "" zurück. Ich überprüfe, ob das Protokoll schreibt und es ist in Ordnung, aber mein Puffer ist immer leer. – Vivi

+0

So zeigen Sie, wie Sie in den Puffer schreiben. Es gibt keinen Grund, dass Sie nicht in der Lage sein sollten, in einen Puffer zu schreiben und es später zu überprüfen. – JimB

Antwort

5

Zum Beispiel

readbyte_test.go:

package main 

import (
    "bytes" 
    "fmt" 
    "io" 
    "log" 
    "os" 
    "testing" 
) 

func readByte(/*...*/) { 
    // ... 
    err := io.EOF // force an error 
    if err != nil { 
     fmt.Println("ERROR") 
     log.Print("Couldn't read first byte") 
     return 
    } 
    // ... 
} 

func TestReadByte(t *testing.T) { 
    var buf bytes.Buffer 
    log.SetOutput(&buf) 
    defer func() { 
     log.SetOutput(os.Stderr) 
    }() 
    readByte() 
    t.Log(buf.String()) 
} 

Ausgang:

$ go test -v readbyte_test.go 
=== RUN TestReadByte 
ERROR 
--- PASS: TestReadByte (0.00s) 
    readbyte_test.go:30: 2017/05/22 16:41:00 Couldn't read first byte 
PASS 
ok  command-line-arguments 0.004s 
$ 
+0

Das funktioniert perfekt! Vielen Dank! – lotif

Verwandte Themen