Assertgolang切片具有相等的元素,无论顺序如何[重复]

w8biq8rn  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(164)

此问题已在此处有答案

Compare structs that have slice fields ignoring item order with stretchr/testify(2个答案)
11天前关闭
我在golang测试中有以下Assert

us.EqualValues(testUnitMergeEnvVars[i].expectedEnvVars, gotValues)

其中ustestify/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
}

既然切片具有相同的元素,为什么测试失败?我不在乎顺序。

drkbr07n

drkbr07n1#

EqualAssert两个对象是相等的-在引擎盖下,它正在进行深度相等检查-当它们都为nil或都为非nil时,切片值被认为是深度相等的,它们具有相同的长度,并且它们要么指向相同底层数组的相同初始实体(即,&a[0] == &b[0]),要么它们对应的元素(直到长度)是深度相等的。在本例中,预期切片和实际切片中元素的顺序不同,Equal检查返回false。由于您希望忽略相等检查中元素的顺序,ElementsMatch将是这里的最佳选择。它可以在测试套件中按如下方式使用。

type KeyValueTestSuite struct {
    suite.Suite
}

func (suite *KeyValueTestSuite) TestKeyValue() {
    expected := []envs.KeyValue{{Key: "MOO", Value: "lala"}, {Key: "KOO", Value: "Lorem\nipsum"}, {Key: "JOO", Value: "JAR"}}
    actual := []envs.KeyValue{{Key: "KOO", Value: "Lorem\nipsum"}, {Key: "MOO", Value: "lala"}, {Key: "JOO", Value: "JAR"}}
    suite.ElementsMatch(expected, actual)
}

func TestExampleTestSuite(t *testing.T) {
    suite.Run(t, new(KeyValueTestSuite))
}

如果你仍然想使用“相等值”,你可能需要在“相等”检查之前,根据你认为最适合你的用例的字段,对两个切片中的元素进行显式排序;与ElementsMatch相比,这种方法有些矫枉过正。

func (suite *KeyValueTestSuite) TestKeyValueV2() {
    expected := []envs.KeyValue{{Key: "MOO", Value: "lala"}, {Key: "KOO", Value: "Lorem\nipsum"}, {Key: "JOO", Value: "JAR"}}
    actual := []envs.KeyValue{{Key: "KOO", Value: "Lorem\nipsum"}, {Key: "MOO", Value: "lala"}, {Key: "JOO", Value: "JAR"}}

    sort.Slice(expected, func(i, j int) bool {
        return expected[i].Key < expected[j].Key
    })
    sort.Slice(actual, func(i, j int) bool {
        return actual[i].Key < actual[j].Key
    })

    suite.EqualValues(expected, actual)
}
cyvaqqii

cyvaqqii2#

你应该使用ElementsMatchAssert:
ElementsMatchfAssert指定的listA(array,slice...)等于指定的listB(array,slice...),忽略元素的顺序。如果有重复的元素,它们在两个列表中的出现次数应该匹配。

相关问题