2017-06-15 22 views
-2

如何從單列一行如何從一個單行斷言多個值,在一行中轉到

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) 

任何幫助非常感謝。

+3

你需要一個庫來做到這一點;可能通過自己寫。但這是非常單一的,所以我建議不要這樣做。 – Flimzy

+1

測試斷言是其中更爲詳細的實際情況之一,而不是試圖儘可能簡潔和緊湊。 – Kaedys

+1

另一種選擇是對所有「c」進行深層次的比較,而不是單個字段。但正如@ Kaedys所表明的那樣,測試越細化,通常就越有用。 – Flimzy

回答

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列。

相關問題