Скажем, у меня был следующий код, который печатает некоторые сообщения журнала. Как я могу проверить, что правильные сообщения были зарегистрированы? Поскольку log.Fatal
звонки os.Exit(1)
, тесты терпят неудачу.Как проверить функцию Go, содержащую 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()
}
Вот гипотетические тесты:
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» немного силен; но я соглашусь с «не должен». Если вы хотите протестировать условие сбоя (не основного) блока кода, тогда не используйте 'log.Fatal' для этого кода, но вместо этого возвращайте' error' (т.если отказ является опцией, имеет API, который представляет это). В подавляющем большинстве случаев «log.Fatal» следует использовать только в функциях 'main' или' init' (или, возможно, некоторые вещи, которые должны быть вызваны только непосредственно из них). –
в сложной распределенной системе есть сценарии, где мой код не может выполнить свою задачу, например, база данных пошла вниз или отсутствует конфигурация. я предпочитаю Fatal здесь, сначала, чтобы избежать выполнения с неопределенным программным состоянием, а во-вторых, чтобы я получил предупреждение о мониторинге – Plato