如何解决如何模拟 gin.Context?
嗨,我一直在尝试模拟 gin.Context 但我一直无法让它工作 我正在尝试他们在此 solution 中所做的,但它不适用于我的路由器,这是我遇到的错误
r.POST("/urls",urlRepo.CreateUrl)
cannot use urlRepo.CreateUrl (value of type func(c controllers.Icontext)) as gin.HandlerFunc value in argument to r.POSTcompilerIncompatibleAssign
这是我创建的用于稍后模拟的接口以及我将在其中进行测试的方法
type Icontext interface {
BindJSON(obj interface{}) error
JSON(code int,obj interface{})
AbortWithStatus(code int)
AbortWithStatusJSON(code int,jsonObj interface{})
}
func (repository *UrlRepo) CreateUrl(c Icontext) {
var url models.Url
c.BindJSON(&url)
if !validators.IsCreateJsonCorrect(url) {
c.AbortWithStatusJSON(http.StatusBadRequest,gin.H{"error": "Error format in Short or Full"})
return
}
err := repository.reposito.CreateUrl(repository.Db,&url)
if err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError,gin.H{"error": err})
return
}
c.JSON(http.StatusOK,url)
}
代替
func (repository *UrlRepo) CreateUrl(c Icontext)
原来是
func (repository *UrlRepo) CreateUrl(c *gin.Context)
解决方法
如果您使用 void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initInjectionContainer();
await sl<AudioManager>().preloadFiles();
runApp(App());
}
作为 http 路由器,则入口点的参数应为 gin-gonic
。
因此,例如,您应该替换它:
*gin.Context
有了这个
func (repository *UrlRepo) CreateUrl(c Icontext) {
通过这种方式,您应该能够使用模拟 gin 上下文作为单元测试的参数
,严格来说,您不能以有意义的方式“模拟”*gin.Context
,因为它是带有未导出字段和方法的 struct
。
此外,您不能将类型不是 r.POST()
的函数传递给 gin.HandlerFunc
,定义为 func(*gin.Context)
。您的处理程序 CreateUrl(c Icontext)
的类型根本不匹配。
如果您的目标是对 Gin 处理程序进行单元测试,则绝对不必模拟 *gin.Context
。您应该做的是在其中设置测试值。为此,您可以简单地使用 gin.CreateTestContext()
并手动初始化其中的一些字段。更多信息here。
如果出于其他原因,您的目标是提供 *gin.Context
功能的替代实现以在处理程序中使用,您可以做的是使用自己的替代方法定义自己的类型并嵌入 { {1}} 在其中。
实践中:
*gin.Context
但老实说,我不确定您为什么要覆盖 type MyGinContext struct {
*gin.Context
}
func (m *MyGinContext) BindJSON(obj interface{}) error {
fmt.Println("my own BindJSON")
return m.Context.BindJSON(obj) // or entirely alternative implementation
}
// Using the appropriate function signature now
func (repository *UrlRepo) CreateUrl(c *gin.Context) {
myCtx := &MyGinContext{c}
var url models.Url
_ = myCtx.BindJSON(&url) // will also print "my own BindJSON"
// ...
// other gin.Context methods are promoted and available on MyGinContext
myCtx.Status(200)
}
的某些方法。如果你想提供不同的绑定逻辑,甚至不同的渲染,你可以实现库已经暴露的接口。例如:
实现绑定:
*gin.Context
将您可以实现的接口 c.ShouldBindWith()
作为第二个参数:
binding.Binding
实现渲染器:
type MyBinder struct {
}
func (m *MyBinder) Name() string {
return "foo"
}
func (m *MyBinder) Bind(*http.Request,interface{}) error {
// stuff
return nil
}
func MyHandler(c *gin.Context) {
var foo struct{/*fields*/}
c.ShouldBindWith(&foo,&MyBinder{})
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。