Код модульного теста: = ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя

Я создал 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()
}

person Justin J    schedule 18.11.2019    source источник
comment
Похоже, что DBCon это nil, где код, который инициализирует эту переменную?   -  person mkopriva    schedule 18.11.2019
comment
Нет, сэр, я настроил базу данных с помощью Viper и все такое, я отредактировал свой вопрос.   -  person Justin J    schedule 18.11.2019
comment
Ничто в добавленном коде не показывает, что DBCon инициализирован правильно, и даже если он инициализируется некоторыми вызовами делегированного метода, ничто в коде вашего вопроса не показывает, что SetupSuite действительно выполняется, как было обещано в его комментарии... Но что бы там ни было, давайте скажите, что вы правы, и DBCon инициализирован, как вы считаете, затем взгляните на трассировку стека, в частности, на оскорбительную часть .../teams.go:11, то есть посмотрите на строку 11 файла teams.go, что вы там видите? какой код есть, можете ли вы добавить это к своему вопросу?   -  person mkopriva    schedule 18.11.2019
comment
спасибо за ваш комментарий, я проверю и пропингую вас   -  person Justin J    schedule 18.11.2019
comment
Да, это работает   -  person Justin J    schedule 18.11.2019


Ответы (1)


В D:/Projects/GoLang/cloudfactory-backend/db/teams.go в строке 11 вы ссылаетесь на поле из нулевого указателя. Без вашего полного исходного кода, включая номера строк, это невозможно точно определить, но, вероятно, он DBCon не инициализируется.

person Ferdy Pruis    schedule 18.11.2019
comment
спасибо за ваш комментарий, я проверю и пропингую вас - person Justin J; 18.11.2019