如何解决测试涉及 sqlboiler 错误的 Gin 路由处理程序 - 接口转换:接口为零,而不是 bool.ContextExecutor
我有一个项目,其中使用了 gin framework 和 sqlboiler 作为 ORM。
我想测试一个处理程序,但我有一个错误,我不知道如何解决它,但我知道这与未将 c context
绑定到测试 API 调用有关。
//book.go
import (
"github.com/volatiletech/sqlboiler/v4/queries"
)
func (ctrl BookController) Item(c *gin.Context) {
var rs BookItem
where,err := ctrl.getWhereQuery(c)
if err != nil {
c.AbortWithStatusJSON(http.StatusUnprocessableEntity,gin.H{"msg": err.Error()})
return
}
rql := fmt.Sprintf("%s %s %s",ctrl.getSelectQuery(),ctrl.getFromQuery(),where,)
err = queries.RawG(rql).BindG(context.Background(),&rs) // THIS LINE IS CAUSING ERROR I THINK.
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError,err)
return
}
rs.Link = viper.GetString("HOST.URI") + "book/" + strconv.Itoa(cast.ToInt(c.Param("id")))
c.JSON(http.StatusOK,rs)
}
当我在邮递员上运行上述代码时,一切正常,我获得了 200
状态。所以这个处理程序没有错。问题是当我想在这样的测试场景中调用这个处理程序时:
// book_test.go
func TestBookController_Item(t *testing.T) {
r := gin.Default()
var ctrl BookController
r.Use(middlewares.Cors())
r.Use(middlewares.Authenticate())
r.Use(middlewares.ActivityLog(true))
r.Use(middlewares.SentryErrorReporter())
r.GET(BookShowEndpoint,ctrl.Item)
ts := httptest.NewServer(r)
defer ts.Close()
client := &http.Client{}
req,err := http.NewRequest("GET",fmt.Sprintf("%s%s",ts.URL,BookShowEndpoint),nil)
if err != nil {
t.Fatalf("Error: %v",err)
}
req.Header.Set("Authorization",utils.Authorization)
resp,err := client.Do(req)
if err != nil {
t.Fatalf("Error: %v",err)
}
if resp.StatusCode != http.StatusOK {
t.Fatalf("Expected status code 200,got %v",resp.StatusCode)
}
}
当我运行此命令 go test -v -run TestBookController_Item --count=1
来测试该路由时,出现此错误:
[GIN-debug] GET /api-publisher/v1/books/book/5008 --> some.route.com/backend/publisher/api/publisher/controllers.BookController.Item-fm (7 handlers)
unexpected end of JSON input
2021/06/07 12:09:09 [Recovery] 2021/06/07 - 12:09:09 panic recovered:
GET /api-publisher/v1/books/book/5008 HTTP/1.1
Host: 127.0.0.1:33603
Accept-Encoding: gzip
Authorization: *
User-Agent: Go-http-client/1.1
interface conversion: interface is nil,not boil.ContextExecutor
/usr/local/go/src/runtime/iface.go:454 (0x40d7fb)
assertI2I: panic(&TypeAssertionError{nil,nil,&inter.typ,""})
/var/www/galaxy_separated/publisher/vendor/github.com/volatiletech/sqlboiler/v4/queries/reflect.go:133 (0xa3b035)
(*Query).Bind: rows,err = q.QueryContext(ctx,exec.(boil.ContextExecutor))
/var/www/galaxy_separated/publisher/vendor/github.com/volatiletech/sqlboiler/v4/queries/reflect.go:52 (0xbbc49e)
(*Query).BindG: return q.Bind(ctx,boil.GetDB(),obj)
/var/www/galaxy_separated/publisher/api/publisher/controllers/book.go:150 (0xbbc443)
BookController.Item: err = queries.RawG(rql).BindG(context.Background(),&rs)
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0xb335f9)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/api/publisher/middlewares/sentry_error_reporter.go:21 (0xb335d8)
sentryErrorReporter.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0xb32a01)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/api/publisher/middlewares/activity_log.go:20 (0xb329ca)
ActivityLog.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0xb32f46)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/api/publisher/middlewares/authentication.go:26 (0xb32f29)
Authenticate.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0xb334d1)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/api/publisher/middlewares/cors.go:18 (0xb334b8)
Cors.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0x9d1679)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/recovery.go:99 (0x9d1660)
CustomRecoveryWithWriter.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0x9d0753)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/logger.go:241 (0x9d0712)
LoggerWithConfig.func1: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/context.go:165 (0x9c6c09)
(*Context).Next: c.handlers[c.index](c)
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/gin.go:489 (0x9c6bef)
(*Engine).handleHTTPRequest: c.Next()
/var/www/galaxy_separated/publisher/vendor/github.com/gin-gonic/gin/gin.go:445 (0x9c66db)
(*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/usr/local/go/src/net/http/server.go:2887 (0x72b542)
serverHandler.ServeHTTP: handler.ServeHTTP(rw,req)
/usr/local/go/src/net/http/server.go:1952 (0x72696c)
(*conn).serve: serverHandler{c.server}.ServeHTTP(w,w.req)
/usr/local/go/src/runtime/asm_amd64.s:1371 (0x473b00)
goexit: BYTE $0x90 // NOP
[GIN] 2021/06/07 - 12:09:09 | 500 | 1.353304ms | 127.0.0.1 | GET "/api-publisher/v1/books/book/5008"
book_test.go:53: Expected status code 200,got 500
--- FAIL: TestBookController_Item (0.00s)
问题似乎与我在上面评论的 book.go
文件上的行有关,因为当我评论该行时,测试通过,但关键是我不应该修改 {{1} } 文件(这是显而易见的)。
其实我觉得问题是这样的:
如何在测试中绑定 context.Background()?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。