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

标签 unit-testing validation go

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

相关文章:

c# - 集成测试 EF5(或 EF4x)

reactjs - 在 Jest 中测试 Axios

php - CodeIgniter - 针对第二个数据库的表单验证

jquery - 我希望 jQuery 验证器向表单元素的父级添加一个类

go - 通过 RenderJson 传递多个值

php - 单元测试和封装

java - JUnit : When do I declare a TemporaryFolder object?

validation - 如何逃避 Angular2 字段验证模式

go - 为什么 Go 支持 Plan9?

python - 在 Windows 中编译 .go ...& python 可以连接到 Go 吗?