假设我正在使用去操场/验证器进行验证,
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
}想要用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
}但是,从去操场/验证器测试中我们可以看到,validator.ValidationErrors是validator.FieldError的一部分。
我正在寻找一种方法显式地测试使用去操场/验证器.的函数中的验证错误。
发布于 2020-10-23 14:28:38
我所能得到的最好结果是利用翻译功能得到一张错误地图:
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")
}
}我是从翻译的示例中获得的:验证器示例:翻译
您得到的是一个map[string]string,其中键是struct字段名,值是已翻译的文本。
https://stackoverflow.com/questions/60503942
复制相似问题