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.go
行 11
中,您从零指针引用了一个字段。如果没有包含行号的完整源代码,则无法查明,但可能 DBCon
未初始化。
我创建了一个工作正常的 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.go
行 11
中,您从零指针引用了一个字段。如果没有包含行号的完整源代码,则无法查明,但可能 DBCon
未初始化。