假设我使用go-playground/validator进行验证,
import (
"github.com/go-playground/validator"
)
type Query struct {
ID string `json:"id" validate:"required,uuid4"`
}
var validate := validator.New()
func DoSomething(query Query) error {
err = r.validate.Struct(query)
if err != nil {
return err
}
// otherwise do something else
return nil
}
并想使用stretchr/testify测试
DoSomething
,import (
"github.com/stretchr/testify/assert"
)
func TestDoSomething(t *testing.T) {
err := DoSomething(Query{})
assert.Equal(s.T(), SomeError, err)
}
我必须如何设置
SomeError
才能通过测试?挑战在于,由
error
返回的validator.Struct(...)
可以是validator.InvalidValidationError
(验证逻辑本身中的错误),也可以是validator.ValidationErrors
(不满足验证约束)。我们对
validator.ValidationErrors
感兴趣,因此我们可能需要更改,func DoSomething(query Query) error {
err = r.validate.Struct(query)
if err != nil {
if err, ok := err.(validator.ValidationErrors); ok {
return err
} else {
// panic
}
}
// otherwise do something else
return nil
}
但是,从go-playground/validator tests中我们看到
validator.ValidationErrors
是validator.FieldError
的一部分。我正在寻找一种方法来显式测试使用go-playground/validator的函数中的验证错误。
最佳答案
我能找到的最好的方法是利用Translation函数获取错误的映射:
import (
"github.com/go-playground/locales/en"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator"
"github.com/stretchr/testify/assert"
"testing"
"time"
)
func TestStructIsValid(t *testing.T) {
/*
This section just sets up translators with defaults. You can write your own
per the specification to get the data the way you want.
*/
v := validator.New()
en := en.New()
uni := ut.New(en, en)
trans, _ := uni.GetTranslator("en")
invalidItem := Item{
CreatedAt: time.Time{},
UpdatedAt: time.Time{},
}
err := v.Struct(invalidTemplate)
assert.NotNil(t, err)
assert.Error(t, err)
//Cast to Validation Error and validate assumptions
validationErr := err.(validator.ValidationErrors)
fieldErrors := validationErr.Translate(trans)
assert.Len(t, fieldErrors, 3)
//Check to see if the map contains a key of Template.Name
assert.Len(t, fieldErrors, 3)
require.Contains(t, fieldErrors, "Template.Name")
if nameField, ok := fieldErrors["Template.Name"]; ok {
//Let's evaluate the error and make sure it's what we expect
assert.Contains(t, nameField, "required")
}
}
我是从翻译示例中得到的:Validator Examples: Translation
您得到的是一个
map[string]string
,其中键是struct字段名称,值是翻译后的文本。
关于unit-testing - 如何测试来自Playground/Validator的验证错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60503942/