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

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

在單元測試中比較 Go 中的 2 個錯誤

在單元測試中比較 Go 中的 2 個錯誤

Go
慕絲7291255 2022-08-24 20:16:06
我遇到了如下問題:編寫單元測試時比較2個錯誤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錯誤,這是我應用的第一種方法,這種方法產生我想要的輸出,但這種方法有一個警告:reflect.DeepEqual(er1, er2)go lintavoid using reflect.DeepEqual with errorsdeepequalerrors在谷歌搜索之后,有些人告訴我一些方法:使用 cmp 包比較:cmp.Equal(er1, er2, cmpopts.EquateErrors())使用錯誤包進行比較:errors.Is(er1, er2)但上述兩種方法都不能產生與第一種方法相同的結果(使用反射。深度等式)。我如何在沒有警告的情況下比較2個錯誤并產生像Tks一樣的結果go lintreflect.DeepEqual
查看完整描述

2 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

根據您編寫測試的方式,您可能會依賴并忽略 linter 警告 ;
缺點是:您根據返回的錯誤的內部結構開始。reflect.DeepEqual()


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

  • 大多數時候,我們只是將錯誤與nil ;

  • 在某些情況下,我們的函數返回預定義的錯誤值,并測試這些特定值:

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) { ...

當我們的生產代碼要求發現特定錯誤時(一個常見的用例是),我們編寫代碼來盡職盡責地包裝該已知錯誤,并且我們使用(在生產代碼和測試代碼中),io.EOFerrors.Is()

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

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

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

}


查看完整回答
反對 回復 2022-08-24
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

我發現有用的是使用cmp。與 cmpopts 比較。IgnoreFields忽略導致問題的單獨錯誤字段,然后我只是用字符串對錯誤運行檢查。包含或我認為合適的任何東西。

所以它是這樣的:

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

現在只檢查自己的錯誤,僅此而已。

是的,我知道你已經標記了一個解決方案,但也許它會幫助某人:)


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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