首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从操场/验证器中测试验证错误?

如何从操场/验证器中测试验证错误?
EN

Stack Overflow用户
提问于 2020-03-03 09:24:18
回答 1查看 2.2K关注 0票数 1

假设我正在使用去操场/验证器进行验证,

代码语言:javascript
复制
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测试担架/作证

代码语言:javascript
复制
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感兴趣,因此我们可能想要改变,

代码语言:javascript
复制
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.ValidationErrorsvalidator.FieldError的一部分。

我正在寻找一种方法显式地测试使用去操场/验证器.的函数中的验证错误。

EN

回答 1

Stack Overflow用户

发布于 2020-10-23 14:28:38

我所能得到的最好结果是利用翻译功能得到一张错误地图:

代码语言:javascript
复制
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字段名,值是已翻译的文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60503942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档