如何在Go中的一行中从一行中断出多个值

时间:2017-06-15 19:11:56

标签: go

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

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)

任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

简答:你不应该这样做。

结合这样的测试可以使代码更容易编写,但可读性更低。更重要的是,它使测试失败更难诊断。假设从现在起6个月,其中一个测试开始失败。您如何知道失败是由于c.operation不符合预期,还是c.change

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

通过组合reflect.DeepEqualgo-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列。