gpt4 book ai didi

go - 如何在 Go 中的一行中的一行中断言多个值

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:22 26 4
gpt4 key购买 nike

如何从单行一行断言多个值

assert.Equal(t, expected_1, actual_1, expected_2, actual_2...)

我当前的代码:

// act
row := tx.QueryRow("select operation, primary_key, before_change, change, changed_at from foo.bar = 'I' order by 1 desc limit 1;")

c := columns{}
row.Scan(&c.operation, &c.primaryKey, &c.beforeChange, &c.change, &c.changedAt)
assert.Equal(t, 0, c.primaryKey)
assert.Equal(t, "I", c.operation)
assert.Equal(t, "", c.beforeChange)
assert.Equal(t, "", c.change)
assert.NotEmpty(t, c.changedAt)

非常感谢任何帮助。

最佳答案

简短回答:你不应该那样做。

像这样组合测试使您的代码更易于编写,但可读性较差。更重要的是,它使测试失败更难诊断。假设 6 个月后,其中一项测试开始失败。您如何知道失败是由于 c.operation 不符合预期还是 c.change 造成的?

更长的答案:考虑进行深度相等比较,并使用文本差异输出。

通过结合reflect.DeepEqualgo-spew和 diff 库,您可以轻松地组合一个断言方法,该方法对两个结构进行深度相等比较,如果它们不匹配,则生成文本差异输出,以便轻松诊断故障。

我有一个库可以在我自己的个人项目中使用。 github.com/flimzy/diff它并不是真正为公众消费而设计的——我建议仅将其用于灵感。但以它为例:

row := tx.QueryRow("select operation, primary_key, before_change, change, changed_at from foo.bar = 'I' order by 1 desc limit 1;")

c := columns{}
row.Scan(&c.operation, &c.primaryKey, &c.beforeChange, &c.change, &c.changedAt)
expected := columns{
operation: "I",
}
if d := diff.Interface(expected, c); d != "" {
t.Error(d)
}

我将它作为练习留给读者如何处理此类测试中的 changedAt 列。

关于go - 如何在 Go 中的一行中的一行中断言多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com