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

Is there a way to mock ValidationErrors in golang?

我有一个函数可以解析 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() 等)。

如果你想 unit-test 一个接受 validator.ValidationErrors 的函数,只需自己构造测试值,使用实现 FieldError.[=20 的类型(可能是结构) =]

方法不多,但如果只想实现自己函数调用的方法,可以在struct类型中嵌入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 编译和 returns 一个字符串,你可以根据你的预期输出断言:

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

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