此问题已在此处有答案:
Compare structs that have slice fields ignoring item order with stretchr/testify(2个答案)
11天前关闭
我在golang
测试中有以下Assert
us.EqualValues(testUnitMergeEnvVars[i].expectedEnvVars, gotValues)
其中us
是testify/suite.Suite
类型。
此操作失败,并显示以下消息
expected: []envs.KeyValue{envs.KeyValue{Key:"MOO", Value:"lala"}, envs.KeyValue{Key:"KOO", Value:"Lorem\nipsum"}, envs.KeyValue{Key:"JOO", Value:"JAR"}}
actual : []envs.KeyValue{envs.KeyValue{Key:"KOO", Value:"Lorem\nipsum"}, envs.KeyValue{Key:"MOO", Value:"lala"}, envs.KeyValue{Key:"JOO", Value:"JAR"}}
切片包含以下自定义类型
type KeyValue struct {
Key string
Value string
}
既然切片具有相同的元素,为什么测试失败?我不在乎顺序。
2条答案
按热度按时间drkbr07n1#
EqualAssert两个对象是相等的-在引擎盖下,它正在进行深度相等检查-当它们都为nil或都为非nil时,切片值被认为是深度相等的,它们具有相同的长度,并且它们要么指向相同底层数组的相同初始实体(即,&a[0] == &b[0]),要么它们对应的元素(直到长度)是深度相等的。在本例中,预期切片和实际切片中元素的顺序不同,Equal检查返回false。由于您希望忽略相等检查中元素的顺序,ElementsMatch将是这里的最佳选择。它可以在测试套件中按如下方式使用。
如果你仍然想使用“相等值”,你可能需要在“相等”检查之前,根据你认为最适合你的用例的字段,对两个切片中的元素进行显式排序;与ElementsMatch相比,这种方法有些矫枉过正。
cyvaqqii2#
你应该使用
ElementsMatch
Assert:ElementsMatchfAssert指定的listA(array,slice...)等于指定的listB(array,slice...),忽略元素的顺序。如果有重复的元素,它们在两个列表中的出现次数应该匹配。