有没有办法在 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]
我有一个函数可以解析 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]