第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在單元測(cè)試中比較 Go 中的 2 個(gè)錯(cuò)誤

在單元測(cè)試中比較 Go 中的 2 個(gè)錯(cuò)誤

Go
慕絲7291255 2022-08-24 20:16:06
我遇到了如下問(wèn)題:編寫單元測(cè)試時(shí)比較2個(gè)錯(cuò)誤package mainimport (    "errors"    "fmt"    "reflect"        "github.com/google/go-cmp/cmp"    "github.com/google/go-cmp/cmp/cmpopts")func main() {    er1 := errors.New("database name is not exists")    er2 := errors.New("database name is not exists")        result1 := reflect.DeepEqual(er1, er2)    fmt.Println("reflect: ", result1)        result2 := cmp.Equal(er1, er2, cmpopts.EquateErrors())    fmt.Println("compare: ", result2)        result3 := errors.Is(er1, er2)    fmt.Println("errorIs: ", result3)}以上代碼的輸出是:reflect:  truecompare:  falseerrorIs:  false我想比較2錯(cuò)誤,這是我應(yīng)用的第一種方法,這種方法產(chǎn)生我想要的輸出,但這種方法有一個(gè)警告:reflect.DeepEqual(er1, er2)go lintavoid using reflect.DeepEqual with errorsdeepequalerrors在谷歌搜索之后,有些人告訴我一些方法:使用 cmp 包比較:cmp.Equal(er1, er2, cmpopts.EquateErrors())使用錯(cuò)誤包進(jìn)行比較:errors.Is(er1, er2)但上述兩種方法都不能產(chǎn)生與第一種方法相同的結(jié)果(使用反射。深度等式)。我如何在沒(méi)有警告的情況下比較2個(gè)錯(cuò)誤并產(chǎn)生像Tks一樣的結(jié)果go lintreflect.DeepEqual
查看完整描述

2 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

根據(jù)您編寫測(cè)試的方式,您可能會(huì)依賴并忽略 linter 警告 ;
缺點(diǎn)是:您根據(jù)返回的錯(cuò)誤的內(nèi)部結(jié)構(gòu)開始。reflect.DeepEqual()


在我閱讀的測(cè)試代碼和我們編寫的測(cè)試代碼中,我們使用以下模式之一:

  • 大多數(shù)時(shí)候,我們只是將錯(cuò)誤與nil ;

  • 在某些情況下,我們的函數(shù)返回預(yù)定義的錯(cuò)誤值,并測(cè)試這些特定值:

package pkg


var ErrUnboltedGizmo = errors.New("gizmo is unbolted")


// in test functions, depending on the case :

if err == pkg.ErrUnboltedGizmo { ...

// or :

if errors.Is(err, pkg.ErrUnboltedGizmo) { ...

當(dāng)我們的生產(chǎn)代碼要求發(fā)現(xiàn)特定錯(cuò)誤時(shí)(一個(gè)常見的用例是),我們編寫代碼來(lái)盡職盡責(zé)地包裝該已知錯(cuò)誤,并且我們使用(在生產(chǎn)代碼和測(cè)試代碼中),io.EOFerrors.Is()

當(dāng)需要僅在測(cè)試中松散地確認(rèn)錯(cuò)誤與某些內(nèi)容匹配而不是其他內(nèi)容(例如:而不是)時(shí),我們只需在錯(cuò)誤消息中搜索字符串:Parse errorFile not found

if err == nil || !strings.Contains(err.Error(), "database name is not exists") {

    t.Errorf("unexpected error : %s", err)

}


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

我發(fā)現(xiàn)有用的是使用cmp。與 cmpopts 比較。IgnoreFields忽略導(dǎo)致問(wèn)題的單獨(dú)錯(cuò)誤字段,然后我只是用字符串對(duì)錯(cuò)誤運(yùn)行檢查。包含或我認(rèn)為合適的任何東西。

所以它是這樣的:

if diff := cmp.Diff(expected, got, cmpopts.IgnoreFields(expected, "ErrorField")); diff != "" { 
          // found diff not including the error
          }

現(xiàn)在只檢查自己的錯(cuò)誤,僅此而已。

是的,我知道你已經(jīng)標(biāo)記了一個(gè)解決方案,但也許它會(huì)幫助某人:)


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)