为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在 golang 中模拟 ValidationErrors?

有没有办法在 golang 中模拟 ValidationErrors?

Go
拉莫斯之舞 2022-11-08 17:09:20
我有一个函数可以解析类型数组中的不同字段ValidationError以生成类似于以下函数的自定义错误消息。func foo(err validator.ValidationErrors) []string {    var errStr []string    for _, e := range err {       tag := e.Tag()       field := e.Field()       errStr = append(errStr, tag + ":" + field)    }    return errStr}我想为此功能编写单元测试,以确保自定义消息符合预期。如何模拟类型的变量validator.ValidationError。下面是ValidationError的结构:type ValidationErrors []FieldErrorFieldError是一个接口,其中包含用于获取错误详细信息的函数(例如Tag()、等)。Field()
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

如果你想对一个接受的函数进行单元测试validator.ValidationErrors,只需自己构造测试值,使用实现的类型(可能是结构)FieldError。


方法不多,但如果你只想实现你的函数调用的那些,你可以嵌入validator.FieldError到结构类型中:


type mockFieldError struct {

    validator.FieldError

    tag   string

    field string

}


func (e mockFieldError) Tag() string { return e.tag }


func (e mockFieldError) Field() string { return e.field }

并构造validator.ValidationErrors(注意,嵌入式validator.FieldError是未初始化的,所以要确保被测函数没有调用其他你没有实现的方法,否则会panic):


    ve := validator.ValidationErrors{

        mockFieldError{tag: "a", field: "field1"},

        mockFieldError{tag: "b", field: "field2"},

    }

所以现在用上面的值调用foo编译并返回一个字符串,你可以根据你的预期输出断言:


    s := foo(ve)

    fmt.Println(s) // [a:field1 b:field2]

完整的游乐场:https ://go.dev/play/p/-btZ6lrKk4V


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信