登录
首页 >  Golang >  Go问答

golang中如何模拟ValidationErrors?

来源:stackoverflow

时间:2024-02-11 08:09:25 431浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《golang中如何模拟ValidationErrors?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我有一个函数可以解析 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 []fielderror

fielderror 是一个接口,其中包含用于获取错误详细信息的函数(例如 tag()field() 等)。


正确答案


如果您想对采用 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

以上就是《golang中如何模拟ValidationErrors?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>