【问题标题】:go - How to mock fiber contextgo - 如何模拟 fiber 上下文
【发布时间】:2022-12-23 03:07:13
【问题描述】:

我一直在尝试模拟 fiber.Ctx 但我无法使其正常工作我一直收到此错误:

--- 失败:TestCheckHeaders(0.00s) 恐慌:运行时错误:无效内存地址或 nil 指针取消引用 [已恢复] 恐慌:运行时错误:无效的内存地址或零指针取消引用 [信号 SIGSEGV:分段违规代码=0x1 地址=0x0 pc=0x12085f0]

我要测试的代码:

CheckHeaders.go

 package middleware

 import "github.com/gofiber/fiber/v2"

 func CheckHeaders(c *fiber.Ctx) error {
    headers := c.GetReqHeaders()
    if headers["headerValue"] == "true"{
        return c.Next()
    } else {
        return c.SendStatus(401)

    }
 }

CheckHeaders_test.go

 package middleware

 import (
    "testing"
    "github.com/gofiber/fiber/v2"
 )

 func TestCheckHeaders(t *testing.T) {
    type args struct {
        c *fiber.Ctx
    }
    fiberContext := fiber.Ctx{}

    tests := []struct {
        name    string
        args    args
        wantErr bool
    }{
        {name: "test 1",
            args:    args{c: &fiberContext},
            wantErr: true,
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if err := CheckHeaders(tt.args.c); (err != nil) != tt.wantErr {
                t.Errorf("CheckHeaders() error = %v, wantErr %v", err,tt.wantErr)
            }
        })
    }
   }

【问题讨论】:

    标签: go testing mocking go-fiber


    【解决方案1】:

    您可以使用需要从 fiber.Ctx struct 中使用的方法创建自己的接口,并为该接口制作 mock。

    之后,您将处理 fiber.Ctx 作为例如 Ctxer 接口的实现,这样您就可以使用 https://github.com/golang/mock 模拟它并在您的测试中使用模拟。

    它会看起来像这样

    type Ctxer interface {
        GetReqHeaders() map[string]string
        Next() (err error)
        SendStatus(status int) error
    }
    
    func CheckHeaders(c Ctxer) error {
        headers := c.GetReqHeaders()
        if headers["headerValue"] == "true" {
            return c.Next()
        } else {
            return c.SendStatus(401)
        }
    }
    

    【讨论】:

      【解决方案2】:

      这就是我如何设置一个新的上下文,我可以操纵它来进行测试。希望能帮助到你。

      app := fiber.New()
      c := app.AcquireCtx(&fasthttp.RequestCtx{})
      

      c 将是一个新鲜的*fiber.Ctx

      【讨论】:

        猜你喜欢
        • 2018-06-08
        • 1970-01-01
        • 2016-03-07
        • 2020-11-04
        • 2021-07-08
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多