Golang - 用于解析 yaml 文件并检查对象的单元测试
Posted
技术标签:
【中文标题】Golang - 用于解析 yaml 文件并检查对象的单元测试【英文标题】:Golang - Unit test for parse yaml file and check objects 【发布时间】:2018-08-17 07:54:45 【问题描述】:我想测试 yaml 的解析并通过单元测试对其进行测试 我已经创建了具有适当类型的结构,但断言总是 错误的,我尝试使用以下代码,但不断失败
这是 有效 的 yaml 内容(可能副本已更改,但我能够正确解析)
ID: demo
version: 0.0.5
dep:
- name: db
path: mtb
requires:
- name: vi_db
- name: srv
path: srv1
properties:
LOG_LEVEL: "info"
parameters:
mem: 12G
requires:
- name: db
properties:
这是我创建的测试
func Test_parseFile(t *testing.T)
yamlfile, err := ioutil.ReadFile("./testdata/file.yaml")
type Properties map[string]string
type Parameters map[string]interface
type Modules struct
Name string
Path string `yaml:"path,omitempty"`
Requires []Requires `yaml:"requires,omitempty"`
Properties Properties `yaml:"properties,omitempty"`
type Requires struct
Name string `yaml:"name,omitempty"`
Properties Properties `yaml:"properties,omitempty"`
type args struct
contentFile []byte
tests := []struct
name string
args args
wantOut Properties
wantNoTests bool
wantErr bool
name: "test",
args: args
contentFile: yamlfile,
,
wantOut: Modules
Name: "srv",
Path: "srv1",
Properties
"LOG_LEVEL": "info",
"DEBUG_LOG_LEVEL": "ALL",
,
Parameters:
"mem":"12G",
,
Requires:
name: "db",
Properties
"CONFIG": '[tomcontext.xml:
"service_nameDB" : "~con-name"]'
,
,
,
wantNoTests: true,
wantErr: true,
,
这是断言代码
for _, tt := range tests
t.Run(tt.name, func(t *testing.T)
gotOut := ParseFile(tt.args.contentFile)
if !reflect.DeepEqual(gotOut.Modules[1], tt.wantOut)
t.Errorf("parseFile() = %v, want %v", gotOut.Modules[2], tt.wantOut)
错误是:
parseFile() = map[], want map[LOG_LEVEL:info DEBUG_LOG_LEVEL:ALL]
我应该如何克服它来检查模块属性?
ParseFile
方法就是 err := yaml.Unmarshal([]byte(yamlFile), &yamlconent)
【问题讨论】:
我的回答解决了你的问题吗? 【参考方案1】:我不完全确定问题是什么,但我设法让你的测试像这样工作:
package sandbox
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v2"
)
type Properties map[string]string
type Parameters map[string]interface
type Requires struct
Name string `yaml:"name,omitempty"`
Properties Properties `yaml:"properties,omitempty"`
type Module struct
Name string
Path string `yaml:"path,omitempty"`
Requires []Requires `yaml:"requires,omitempty"`
Properties Properties `yaml:"properties,omitempty"`
Parameters Parameters `yaml:"parameters,omitempty"`
type File struct
Modules []Module
func Test_ParseFile(t *testing.T)
input := []byte(`ID: demo
version: 0.0.5
modules:
- name: db
path: mtb
requires:
- name: vi_db
- name: srv
path: srv1
properties:
LOG_LEVEL: "info"
DEBUG_LOG_LEVEL : ALL
parameters:
mem: 12G
requires:
- name: db
properties:
CONFIG: '[tomcontext.xml:
"service_nameDB" : "~con-name"]'`)
tests := []struct
name string
wantOut Module
name: "test",
wantOut: Module
Name: "srv",
Path: "srv1",
Properties: Properties
"LOG_LEVEL": "info",
"DEBUG_LOG_LEVEL": "ALL",
,
Parameters: Parameters
"mem": "12G",
,
Requires: []Requires
Name: "db",
Properties: Properties
"CONFIG": `[tomcontext.xml: "service_nameDB" : "~con-name"]`,
,
,
,
,
,
for _, tt := range tests
t.Run(tt.name, func(t *testing.T)
actual, err := ParseFile(input)
require.NoError(t, err)
require.NotNil(t, actual)
require.Len(t, actual.Modules, 2)
assert.Equal(t, tt.wantOut, actual.Modules[1])
)
func ParseFile(yamlFile []byte) (File, error)
var f File
err := yaml.Unmarshal(yamlFile, &f)
return f, err
请注意,我导入了 https://github.com/stretchr/testify 以使测试更容易一些。当然,您可以将其替换为原始的 reflect.DeepEquals
支票。 Testify 在这里很有用,因为它会打印一个有用的差异,以防不符合期望。
【讨论】:
以上是关于Golang - 用于解析 yaml 文件并检查对象的单元测试的主要内容,如果未能解决你的问题,请参考以下文章