亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

斷言指向字符串的指針切片包含預期字符串的正確方法?

斷言指向字符串的指針切片包含預期字符串的正確方法?

Go
墨色風雨 2022-12-26 10:29:47
是否有一種簡單而緊湊的方法使用 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"))

}

在 Go Playground 中查看這些。


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號