Как полностью отключить glog для запуска тестов?

Я пишу тестовый код для своего кода и хотел бы получить 100% покрытие кода.

Это подразумевает тестирование крайних случаев, которые вызывают, например, glog.Fatal().

Итак, первое, что мне нужно, это отключить любой вывод с помощью glog, потому что я не тестирую glog. Таким образом, я могу запустить тест go без создания файлов в /tmp или отправки сообщений в stderr.

Во-вторых, мне нужно, чтобы вызов glog.Fatal(), который вызывает os.Exit(), не мешал запуску теста.

Как я мог этого добиться?


person chmike    schedule 26.11.2016    source источник


Ответы (1)


Вы должны быть в состоянии достичь этого, запрограммировав интерфейс glog. Я не уверен, что это такое, но это может выглядеть так

type Logger interface {
  Fatal()
  Info()
  // etc...
}

Тогда вашим пакетам/функциям/структурам и т. д. потребуется интерфейс, а не глобальный.

type SomeStruct struct {
  log Logger
}

Или на ваших модулях верхнего уровня:

func SomeFunc(log Logger) {}

Использование интерфейса отделяет ваш код от конкретной реализации регистратора.

В своих модульных тестах вы можете создать регистратор для конкретного теста, который является заглушкой или макетом.

type TestLogger struct {}
func (tl TestLogger) Fatal() {}
func (tl TestLogger) Info() {}
// etc....

Затем ваш код должен иметь возможность создавать и настраивать реальный экземпляр Glog в вашем производственном коде. Чтобы проверить это, нужно просто инкапсулировать «создание» экземпляра Glog.

func NewLogger Logger {
  // configure `Glog` 
  // return `Glog`
}

Таким образом, вы сможете выполнить модульное тестирование, чтобы NewLogger правильно конфигурировал регистратор, фактически не обращаясь к регистратору.

person dm03514    schedule 26.11.2016
comment
Это выглядит интересно. Я удалю зависимости glog. Он использует глобальный. - person chmike; 26.11.2016