是否有一種簡單而緊湊的方法使用 Testify 來斷言一段指向字符串的指針包含指向符合我期望的字符串的指針?想象一下,您正在從函數調用(可能來自 API)中獲取一段指向字符串的指針,并且您想要驗證它是否包含指向您期望的字符串的指針。為了模擬這一點,我將制作一個測試數據結構來說明我的觀點:// Shared Fixturevar one = "one"var two = "two"var three = "three"var slice = []*string{&one, &two, &three}現在我想編寫一個斷言切片包含預期值的測試。我可以寫這個測試:func TestSliceContainsString(t *testing.T) { assert.Contains(t, slice, "one")}它不起作用:[]*string{(*string)(0x22994f0), (*string)(0x2299510), (*string)(0x2299500)} does not contain "one"。有道理,切片包含指向字符串的指針,而字符串“one”不是這些指針之一。我可以先轉換它。它需要更多代碼,但它有效:func TestDereferencedSliceContainsString(t *testing.T) { deref := make([]string, len(slice)) for i, v := range slice { deref[i] = *v } assert.Contains(t, deref, "one")}我也可以按照我的期望傳遞一個指向字符串的指針:func TestSliceContainsPointerToExpectation(t *testing.T) { expect := "one" assert.Same(t, &one, &one) assert.NotSame(t, &one, &expect) // How can I assert that they contain values assert.Contains(t, slice, &expect)}老實說,這還不錯。我可以斷言對字符串的引用(指向不同的內存位置)包含我期望的值。這條路徑的主要煩惱是我無法傳遞對文字的引用,這會占用更少的空間:func TestSliceContainsString(t *testing.T) { assert.Contains(t, slice, &"one")}還有其他我沒有考慮的方法嗎?golang / testify 中的其中一個更慣用嗎?
1 回答

茅侃侃
TA貢獻1842條經驗 獲得超22個贊
是的,不幸的是&"one"語法無效(幾年前,我打開了一個允許該語法的問題;它被關閉了,盡管 Rob Pike最近打開了一個類似的問題)。
現在,我認為最好的方法是只獲取一個變量的地址,就像在你的TestSliceContainsPointerToExpectation. 或者,如果你經常這樣做,你可以編寫一個簡單的stringPtr函數,這樣你就可以把它作為一個單行代碼來完成:
func stringPtr(value string) *string {
return &value
}
func TestSliceContainsString(t *testing.T) {
assert.Contains(t, slice, stringPtr("one"))
}
或者,如果你至少使用 Go 1.18(帶有泛型),你可以創建一個泛型ptr函數:
func ptr[T any](value T) *T {
return &value
}
func TestSliceContains(t *testing.T) {
assert.Contains(t, slice, ptr("one"))
}
- 1 回答
- 0 關注
- 88 瀏覽
添加回答
舉報
0/150
提交
取消