Я пишу веб-приложение в go, и оно работает отлично. Однако при запуске тестов для пакета команда go test
просто зависает (ничего не делает, даже не заканчивается).Go зависает при запуске тестов
У меня есть функция для тестирования, который запускает сервер:
func mkroutes(t *testing.T, f func()) {
handlerRegistry = handlerList([]handler{})
middlewareRegistry = []middleware{}
if testListener == nil {
_testListener, err := net.Listen("tcp", ":8081")
testListener = _testListener
if err != nil {
fmt.Printf("[Fail] could not start tcp server:\n%s\n", err)
}
}
f()
go func() {
if err := serve(testListener, nil); err != nil {
fmt.Printf("[Fail] the server failed to start:\n%s\n", err)
t.FailNow()
}
}()
}
Если изменить порт, который он прослушивает, все работает нормально (все тесты потерпеть неудачу, хотя, так как они не могут подключиться к сервер). Это показывает, что код действительно работает, но если я записываю что-то в функции или даже в функцию init
, а порт правильно, он снова ломается.
После того, как я принудительно завершаю команду go test
, она печатает все, что я зарегистрировал, а затем выходим. Это приводит меня к мысли, что что-то еще блокирует основной поток до того, как выполнение достигнет журнала, но это невозможно, так как изменение порта имеет значение.
В пакете нет никаких init
функций, и только код, который запускается при запуске, составляет var sessionStore = sessions.NewCookieStore([]byte("test-key"))
, который использует пакет github.com/gorilla/sessions
. Когда я запускаю программу в обычном режиме, это не вызывает проблем, и я не вижу ничего в источнике пакета, что приведет к тому, что он будет вести себя по-разному при тестировании.
Это единственный пакет за пределами стандартной библиотеки, которая импортируется.
Я могу предоставить любой другой код в пакете, но я не знаю, что актуально.
Что делает функция 'f'? Как предполагается, что следующие функции будут выполняться, если 'f' не запущен как goroutine? Разве это не должно быть помещено * после * подарочной гортины? – Mostafa
Все любят отлаживать неполные программы. – zzzz
Вам нужно предоставить нам небольшой фрагмент кода, который мы можем скомпилировать и запустить, чтобы воспроизвести вашу проблему. – peterSO