首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中定义给定字符串变量的validator.Fieldlevel等效值?

如何在Go中定义给定字符串变量的validator.Fieldlevel等效值?
EN

Stack Overflow用户
提问于 2022-02-06 14:50:45
回答 1查看 696关注 0票数 2

我正在使用Go的验证程序包验证我的配置文件

我作为string读取的配置文件中的一个字段(string),希望确保它是一个有效的时间duration

代码语言:javascript
复制
type Config struct{
    ...
    CreateTime   string `yaml:"createTime" validate:"duration,required"`
    ...
}

因此,我编写了如下自定义验证函数:

代码语言:javascript
复制
import (
    "time"
    "github.com/go-playground/validator/v10"
)

// isValidDuration is a custom validation function, and it will check if the given string is a valid time duration
func isValidDuration(fl validator.FieldLevel) bool {
    if _, err := time.ParseDuration(fl.Field().String()); err != nil {
        return false
    }
    return true
}

用于验证的内容如下:

代码语言:javascript
复制
func (configObject *Config) Validate() error {

    // Validate configurations
    validate := validator.New()
    if err := validate.RegisterValidation("duration", isValidDuration); err != nil {
        return err
    }
    return validate.Struct(configObject)
}

自定义验证器工作正常,我想为isValidDuration函数编写一个单元测试。下面是IDE生成的单元测试样板:

代码语言:javascript
复制
import (
    "testing"
    "github.com/go-playground/validator/v10"
)

func Test_isValidDuration(t *testing.T) {
    type args struct {
        fl validator.FieldLevel
    }
    var tests = []struct {
        name string
        args args
        want bool
    }{
        // TODO: Add test cases.
        {name: "positive", args: ???????, want: true},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := isValidDuration(tt.args.fl); got != tt.want {
                t.Errorf("isValidDuration() = %v, want %v", got, tt.want)
            }
        })
    }
}

我是新手,不知道在上面的testcase的args字段中传递什么。如何创建包含一个struct字段的validator.FieldLevel

理想情况下,我希望将类似于"10m"的内容作为args传递,并且由于它是一个有效的持续时间,因此希望isValidDuration输出为true,因为"10m"是一个有效的持续时间。我正在尝试这个:{name: "positive", args: struct{ fl validator.FieldLevel }{fl: "10m"}, want: true},但得到这封信:'"10m"' (type string) cannot be represented by the type validator.FieldLevel

如何创建一个值等于validator.FieldLevel"10m"变量?有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-07 04:12:23

problem1

一个语言语义问题,fl不是类型字符串。

代码语言:javascript
复制
{
  name: "positive", 
  args: args{
    fl: validator.FieldLevel{
       // ....
    },
  }, 
  want: true,
},

problem2

如何使用validator.FieldLevel

在代码库中,我们可以看到FieldLevel是一个接口,您需要创建结构validate,它不是导出的,不应该被用户使用。

代码语言:javascript
复制
type FieldLevel interface

// ...

var _ FieldLevel = new(validate)

回答

所以,最好像UT那样编写验证器包。不要使用IDE中的代码!

代码语言:javascript
复制
// have a look at this UT
// github.com/go-playground/validator/v10@v10.10.0/validator_test.go
func TestKeysCustomValidation(t *testing.T) {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71008310

复制
相关文章

相似问题

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