Dire, ho avuto il seguente codice che stampa alcuni messaggi di registro. Come posso verificare che i messaggi corretti siano stati registrati? Come log.Fatal
chiamate os.Exit(1)
i test falliscono.Come testare la funzione Go contenente log.Fatal()
package main
import (
"log"
)
func hello() {
log.Print("Hello!")
}
func goodbye() {
log.Fatal("Goodbye!")
}
func init() {
log.SetFlags(0)
}
func main() {
hello()
goodbye()
}
Ecco le prove di ipotetici:
package main
import (
"bytes"
"log"
"testing"
)
func TestHello(t *testing.T) {
var buf bytes.Buffer
log.SetOutput(&buf)
hello()
wantMsg := "Hello!\n"
msg := buf.String()
if msg != wantMsg {
t.Errorf("%#v, wanted %#v", msg, wantMsg)
}
}
func TestGoodby(t *testing.T) {
var buf bytes.Buffer
log.SetOutput(&buf)
goodbye()
wantMsg := "Goodbye!\n"
msg := buf.String()
if msg != wantMsg {
t.Errorf("%#v, wanted %#v", msg, wantMsg)
}
}
"Can not" è un po 'forte; ma sono d'accordo con "non dovrebbe". Se vuoi testare una condizione di fallimento di un blocco (non principale) di codice, allora non usare 'log.Fatal' per quel codice ma restituisci un' error' invece (es.se l'errore è un'opzione, avere un'API che lo rappresenta). Nella stragrande maggioranza dei casi 'log.Fatal' dovrebbe essere usato solo nelle funzioni' main', o 'init' (o possibilmente alcune cose che devono essere chiamate solo direttamente da esse). –
in un sistema distribuito complicato ci sono scenari in cui il mio codice non può eseguire il suo compito, ad esempio un database è andato giù o manca la configurazione. preferisco Fatal qui, in primo luogo per evitare l'esecuzione con lo stato del programma indeterminato e il secondo per garantire che ottengo un avviso di monitoraggio – Plato