如何模拟 gin.Context?

2024-04-25

嗨,我一直在尝试模拟杜松子酒。Context 但我无法使其工作 我正在尝试他们在这方面所做的solution https://stackoverflow.com/questions/41742988/make-mock-gin-context-in-golang但它不适用于我的路由器,这是我收到的错误

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)

it was

func (repository *UrlRepo) CreateUrl(c *gin.Context) 

严格来说,你不能“嘲笑”*gin.Context以一种有意义的方式,因为它是struct具有未导出的字段和方法。

此外,你不能传递到r.POST()类型不是 a 的函数gin.HandlerFunc, 定义为func(*gin.Context)。您的处理程序的类型CreateUrl(c Icontext)根本不匹配。

如果您的目标是对 Gin 处理程序进行单元测试,那么您绝对不必模拟*gin.Context。您应该做的就是在其中设置测试值。为此,您可以简单地使用gin.CreateTestContext()并手动初始化其中一些字段。更多信息here https://stackoverflow.com/questions/66952761/how-to-unit-test-a-go-gin-handler-function/66953599#66953599.

如果出于其他原因,您的目标是提供以下功能的替代实现*gin.Context为了在处理程序中使用,您可以做的是使用自己的替代方法定义自己的类型并嵌入*gin.Context in it.

在实践中:

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{})
}

实现渲染器:

type MyRenderer struct {
}

type Render interface {
func (m *MyRenderer) Render(http.ResponseWriter) error {
    // ...
    return nil
}

func (m *MyRenderer) WriteContentType(w http.ResponseWriter) {
    header := w.Header()
    if val := header["Content-Type"]; len(val) == 0 {
        header["Content-Type"] = "application/foo+bar"
    }
}

func MyHandler(c *gin.Context) {
   c.Render(200, &MyRenderer{})
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模拟 gin.Context? 的相关文章

  • 如何使用 cypress.io 处理 PayPal 弹出窗口上的元素

    我需要自动化端到端测试 包括使用 PayPal 购买订单 此测试包括验证购买订单后出现的屏幕中的某些元素 我目前正在尝试使用 cypress io 我知道赛普拉斯建议不要访问第三方网站 https docs cypress io guide
  • 如何在Python中模拟“+”运算符(特别是datetime.date + datetime.timedelta)

    我已经解决了 Django 中的一些日期模拟问题 并且最后的障碍 我希望 是以下情况 我有一个 FakeDate 类 它派生于datetime date 它嘲笑了 FakeDate 类按预期工作 但是在添加datetime timedelt
  • 识别推文消息中正确的主题标签索引

    我需要识别 Twitter 消息 各种语言 表情符号等 中的正确索引 我找不到返回这些位置的解决方案 如下例所示 import regexp testing github com stretchr testify require func
  • 按顺序范围循环映射

    我正在寻找一种确定的方法来范围Go map为了 Go 规范 https golang org ref spec For statements陈述如下 映射的迭代顺序未指定 并且不保证从一次迭代到下一次迭代的顺序相同 如果在迭代过程中删除尚未
  • 如何访问 Go 中的嵌套模块(子模块)?

    去版本 1 12 9 这是一个简单演示项目的结构 所以我们有一个模块domain 其中包含两个模块 activity and person 我想将域与主文件中的所有嵌套模块一起使用 gt 模块 go 我知道如何导入domain主要在go m
  • 如何在Go中从interface{}解组到interface{}

    我的系统中有多个通过 RPC 进行通信的节点 我正在尝试通过 RPC 将 map string interface 发送到另一个节点 发送方使用 json Marshal 接收方使用 json Unmarshal 来获取地图 假设在发送方
  • 如何对 Grails 应用程序进行并发修改测试

    我想运行测试来模拟用户同时修改 Grails 应用程序的某些数据 我可以使用任何插件 工具 机制来有效地做到这一点吗 它们不必是特定于 grails 的 应该可以并行触发多个操作 我更愿意在功能级别上运行测试 到目前为止我正在使用 Sele
  • Unit::Test 与 Rspec 之间的区别 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对感兴趣Test Unit and Rspec 有人可以向我解释一下两者之间的主要区别是什么 就它们的运作原理而言 测试 单位更类似于 JUn
  • 使用 google test 进行数据驱动的单元测试

    我目前正在使用以下方法为嵌入式应用程序编写单元测试谷歌单元测试框架 https github com google googletest 现在 我的老板对我测试的数据 即我调用被测类的方法的值 在测试中是硬连接的感到不安 他请求从文件中读入
  • Golang 中的“相互”包导入

    是否可以在 Golang 中执行 相互 包导入之类的操作 举例来说 我有两个包 A 和 B 分别具有 AFunc 和 BFunc BFunc2 函数 package A import B func AFunc do stuff but al
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 如何在Spring中模拟ModelMapper?

    我正在尝试为我的服务层编写单元测试 SpringBootTest class ClinicServiceTest Mock private ProcedureRepository procedureRepository InjectMock
  • mysql 查询中的 golang 切片,带有 where in 子句

    我正在运行以下查询 但只获取第一个 id 值 select from table where table id in 1 2 3 4 5 6 7 9 11 13 14 15 17 and table deleted at is null 我
  • 使用 Mockito 对 Runnable 进行单元测试

    我有这样的代码 我想为其编写单元测试 public class TestClass private final Executor executor private final Handler handler TestClass Execut
  • 在 PHPUnit 中实现给定接口的模拟对象上未定义方法?

    我是单元测试和 PHPUnit 的新手 我需要一个模拟 我可以完全控制它 实现ConfigurationInterface界面 测试对象是ReportEventParamConverter对象和测试必须检查我的对象和界面之间的交互 Repo
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • 如何使用静态方法最小起订量静态类(UnitOfWork 情况)?

    我有这些课程 public static class UnitOfWorkSS public static IUnitOfWork Begin return IoC Resolve
  • 如何在 JUnit5 中为测试套件设置自定义测试执行顺序?

    我在 JUnit5 上进行了大量测试 并在多个线程中并行运行 还有有关每次测试时间的信息 我想在最长的测试开始时运行 并将最快的测试留在最后以优化公共执行时间 我还没有找到在 JUnit5 中执行此操作的方法 版本中5 4有一个org ju
  • Golang delve,如何启动调试器并启动正在调试的应用程序?

    我正在尝试设置一个可以远程连接的无头深度调试器 我无法找到一种方法来启动调试服务器 而该服务器不会暂停我正在调试的应用程序 我一直在使用dlv attach headless true listen 2345 attach 32但这会暂停该
  • 我怎样才能修复这段代码中的这个错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我运行 jUnit 测试时 我在 testSetName 上遇到错误 这是为什么 因为测试是为了查看名称是否为 ferndown 以及它

随机推荐