go -如何模拟纤程上下文

e3bfsja2  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(230)

我一直在尝试模拟一个fiber.Ctx,但我一直无法使它工作,我一直得到这个错误:
---失败:测试检查信头(0.00s)死机:运行时错误:内存地址无效或空指针取消引用[已恢复]死机:运行时错误:无效存储器地址或空指针解除引用[信号SIGSEGV:分段违规代码= 0x 1地址= 0x 0 pc= 0x 12085 f0]
我尝试测试的代码:

检查邮件头.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)

    }
 }

检查信头_测试.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)
            }
        })
    }
   }
dced5bon

dced5bon1#

您可以使用fiber.Ctx结构中需要使用的方法创建自己的接口,并为该接口创建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)
    }
}

相关问题