gpt4 book ai didi

unit-testing - 如何测试来自Playground/Validator的验证错误?

转载 作者:行者123 更新时间:2023-12-03 10:09:36 28 4
gpt4 key购买 nike

假设我使用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.ValidationErrorsvalidator.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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com