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)
}

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ì)幫助某人:)
- 2 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)