Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何测试go游乐场/验证器的验证错误?_Unit Testing_Validation_Go - Fatal编程技术网

Unit testing 如何测试go游乐场/验证器的验证错误?

Unit testing 如何测试go游乐场/验证器的验证错误?,unit-testing,validation,go,Unit Testing,Validation,Go,假设我使用的是验证 导入( “github.com/go playway/validator” ) 类型查询结构{ ID字符串`json:“ID”验证:“必需,uuid4”` } var validate:=validator.New() func DoSomething(查询)错误{ err=r.validate.Struct(查询) 如果错误!=零{ 返回错误 } //否则就做点别的 归零 } 并想用 导入( “github.com/stretchr/authentic/assert” )

假设我使用的是验证

导入(
“github.com/go playway/validator”
)
类型查询结构{
ID字符串`json:“ID”验证:“必需,uuid4”`
}
var validate:=validator.New()
func DoSomething(查询)错误{
err=r.validate.Struct(查询)
如果错误!=零{
返回错误
}
//否则就做点别的
归零
}
并想用

导入(
“github.com/stretchr/authentic/assert”
)
func TestDoSomething(t*testing.t){
err:=DoSomething(查询{})
assert.Equal(s.T(),SomeError,err)
}
如何设置
SomeError
,使测试通过

挑战在于
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
的一部分


我正在寻找一种方法来明确测试使用的函数中的验证错误。

我所能做的最好的事情就是利用转换函数获取错误的映射:


进口(
“github.com/go playder/locales/en”
ut“github.com/go playder/universal translator”
“github.com/go playway/validator”
“github.com/stretchr/authentic/assert”
“测试”
“时间”
)
func TestStructIsValid(t*testing.t){
/*
本节仅设置具有默认值的翻译器。您可以编写自己的翻译器
按照规范以您想要的方式获取数据。
*/
v:=validator.New()
en:=en.New()
uni:=ut.New(en,en)
trans,:=uni.GetTranslator(“en”)
无效项:=项目{
CreatedAt:time.time{},
UpdatedAt:time.time{},
}
错误:=v.Struct(invalidTemplate)
assert.NotNil(t,err)
assert.Error(t,err)
//转换为验证错误并验证假设
ValidationError:=错误。(validator.ValidationErrors)
fieldErrors:=validationErr.Translate(trans)
assert.Len(t,fieldErrors,3)
//检查映射是否包含Template.Name的键
assert.Len(t,fieldErrors,3)
require.Contains(t,fieldErrors,“Template.Name”)
如果是nameField,则确定:=fieldErrors[“Template.Name”];确定{
//让我们评估错误并确保它符合我们的预期
assert.Contains(t,nameField,“必选”)
}
}
我从翻译示例中得到:

您得到的是一个
map[string]string
,其中键是结构字段名,值是翻译后的文本