如何从单行一行断言多个值
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)
任何帮助非常感谢。
答案 0 :(得分:0)
简答:你不应该这样做。
结合这样的测试可以使代码更容易编写,但可读性更低。更重要的是,它使测试失败更难诊断。假设从现在起6个月,其中一个测试开始失败。您如何知道失败是由于c.operation
不符合预期,还是c.change
?
更长的回答:考虑使用文本差异输出进行深度相等的比较。
通过组合reflect.DeepEqual
,go-spew和差异库,您可以轻松地组合一个断言方法,对两个结构进行深度相等的比较,如果它们不匹配,产生文本差异输出,以便于诊断故障。
我有一个库,可以在我自己的个人项目中使用它。 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
列。