Я создал API, который работает нормально, но я получил сообщение об ошибке, например
ошибка выполнения: неверный адрес памяти или разыменование нулевого указателя
когда выполняется код модульного теста.
полный ответ для вашей справки
runtime error: invalid memory address or nil pointer dereference
D:/Go/src/runtime/panic.go:199 (0x447473)
panicmem: panic(memoryError)
D:/Go/src/runtime/signal_windows.go:233 (0x447320)
sigpanic: panicmem()
D:/Projects/GoLang/cloudfactory-backend/db/teams.go:11 (0xb49b36)
SelectAllTeams: func SelectAllTeams() (teams []models.Team, err error) {
D:/Projects/GoLang/cloudfactory-backend/services/teams.go:11 (0xbb09ec)
GetTeams: teams, err = db.SelectAllTeams()
D:/Projects/GoLang/cloudfactory-backend/controllers/api.go:32 (0xbb1b51)
ApiController.GetTeams: teams, err := services.GetTeams()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x9f7da1)
(*Context).Next: c.handlers[c.index](c)
D:/Projects/GoLang/cloudfactory-backend/middlewares/db_logger.go:72 (0xc30430)
DBLogger.func1: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x9f7da1)
(*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/recovery.go:83 (0xa0b2ca)
RecoveryWithWriter.func1: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x9f7da1)
(*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/logger.go:240 (0xa0a357)
LoggerWithConfig.func1: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x9f7da1)
(*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:389 (0xa01798)
(*Engine).handleHTTPRequest: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:351 (0xa00fba)
(*Engine).ServeHTTP: engine.handleHTTPRequest(c)
D:/Projects/GoLang/cloudfactory-backend/tests/controller_tests/api_test.go:73 (0xc69edd)
(*ApiSute).TestGetArticle1: suite.Router.ServeHTTP(resp, req)
D:/Go/src/reflect/value.go:460 (0x4df3ac)
Value.call: call(frametype, fn, args, uint32(frametype.size), uint32(retOffset))
D:/Go/src/reflect/value.go:321 (0x4deb6a)
Value.Call: return v.call("Call", in)
C:/Users/justin.joseph/go/pkg/mod/github.com/stretchr/[email protected]/suite/suite.go:133 (0x7e0d15)
Run.func2: method.Func.Call([]reflect.Value{reflect.ValueOf(suite)})
D:/Go/src/testing/testing.go:909 (0x52a85f)
tRunner: fn(t)
D:/Go/src/runtime/asm_amd64.s:1357 (0x461ab0)
goexit: BYTE $0x90 // NOP
Моя функция кода модульного теста
func (suite *ApiSute) TestGetTeams() {
req, err := http.NewRequest("GET", "/api/teams", nil)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
resp := httptest.NewRecorder()
suite.Router.ServeHTTP(resp, req)
suite.Equal(suite.Response.Code, 200)
}
Моя модельная функция SelectAllTeams
func SelectAllTeams() (teams []models.Team, err error) {
sqlStatement := `
SELECT team_uuid, name, code, description FROM cf.team`
err = DBCon.Ping()
if err != nil {
log.Print(err)
return
}
err = DBCon.Select(&teams, sqlStatement)
if err != nil {
log.Print("Error selecting team...")
log.Print(err)
return
}
return
}
Моя конфигурация БД и другие вещи
type ApiSute struct {
suite.Suite
Config *viper.Viper
Router *gin.Engine
Response *httptest.ResponseRecorder
}
// sets up suite with dev configs and starts sets up the router
// SetupSuite runs once before executing any tests
func (suite *ApiSute) SetupSuite() {
config.Init("dev")
suite.Config = config.GetConfig()
suite.Router = server.SetupRouter()
}
DBCon
этоnil
, где код, который инициализирует эту переменную? - person mkopriva   schedule 18.11.2019DBCon
инициализирован правильно, и даже если он инициализируется некоторыми вызовами делегированного метода, ничто в коде вашего вопроса не показывает, чтоSetupSuite
действительно выполняется, как было обещано в его комментарии... Но что бы там ни было, давайте скажите, что вы правы, иDBCon
инициализирован, как вы считаете, затем взгляните на трассировку стека, в частности, на оскорбительную часть.../teams.go:11
, то есть посмотрите на строку11
файлаteams.go
, что вы там видите? какой код есть, можете ли вы добавить это к своему вопросу? - person mkopriva   schedule 18.11.2019