Unit test code := runtime error: invalid memory address or nil pointer dereference

Unit test code := runtime error: invalid memory address or nil pointer dereference

我创建了一个工作正常的 API,但我收到了类似

的错误

runtime error: invalid memory address or nil pointer dereference

执行单元测试代码时。

完整回复供您参考

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/gin@v1.4.0/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/gin@v1.4.0/context.go:124 (0x9f7da1)
    (*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/recovery.go:83 (0xa0b2ca)
    RecoveryWithWriter.func1: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/context.go:124 (0x9f7da1)
    (*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/logger.go:240 (0xa0a357)
    LoggerWithConfig.func1: c.Next()
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/context.go:124 (0x9f7da1)
    (*Context).Next: c.handlers[c.index](c)
C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/gin.go:389 (0xa01798)
    (*Engine).handleHTTPRequest: c.Next()
 C:/Users/justin.joseph/go/pkg/mod/github.com/gin-gonic/gin@v1.4.0/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/testify@v1.4.0/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    [=10=]x90   // 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()
}

D:/Projects/GoLang/cloudfactory-backend/db/teams.go11 中,您从零指针引用了一个字段。如果没有包含行号的完整源代码,则无法查明,但可能 DBCon 未初始化。