ソースを参照

return *CommonError instead of errorString (#568)

sū hǎi 4 年 前
コミット
f2e7979a9f
2 ファイル変更67 行追加2 行削除
  1. 12 2
      util/error.go
  2. 55 0
      util/error_test.go

+ 12 - 2
util/error.go

@@ -8,10 +8,15 @@ import (
 
 // CommonError 微信返回的通用错误json
 type CommonError struct {
+	apiName string
 	ErrCode int64  `json:"errcode"`
 	ErrMsg  string `json:"errmsg"`
 }
 
+func (c *CommonError) Error() string {
+	return fmt.Sprintf("%s Error , errcode=%d , errmsg=%s", c.apiName, c.ErrCode, c.ErrMsg)
+}
+
 // DecodeWithCommonError 将返回值按照CommonError解析
 func DecodeWithCommonError(response []byte, apiName string) (err error) {
 	var commError CommonError
@@ -19,8 +24,9 @@ func DecodeWithCommonError(response []byte, apiName string) (err error) {
 	if err != nil {
 		return
 	}
+	commError.apiName = apiName
 	if commError.ErrCode != 0 {
-		return fmt.Errorf("%s Error , errcode=%d , errmsg=%s", apiName, commError.ErrCode, commError.ErrMsg)
+		return &commError
 	}
 	return nil
 }
@@ -45,7 +51,11 @@ func DecodeWithError(response []byte, obj interface{}, apiName string) error {
 		return fmt.Errorf("errcode or errmsg is invalid")
 	}
 	if errCode.Int() != 0 {
-		return fmt.Errorf("%s Error , errcode=%d , errmsg=%s", apiName, errCode.Int(), errMsg.String())
+		return &CommonError{
+			apiName: apiName,
+			ErrCode: errCode.Int(),
+			ErrMsg:  errMsg.String(),
+		}
 	}
 	return nil
 }

+ 55 - 0
util/error_test.go

@@ -0,0 +1,55 @@
+package util
+
+import "testing"
+
+var okErrData string = `{"errcode": 0}`
+var errData string = `{"errcode": 43101, "errmsg": "user refuse to accept the msg"}`
+var expectError string = "Send Error , errcode=43101 , errmsg=user refuse to accept the msg"
+
+func TestDecodeWithCommonErrorNoError(t *testing.T) {
+	err := DecodeWithCommonError([]byte(okErrData), "Send")
+	if err != nil {
+		t.Error("DecodeWithCommonError should not return error")
+		return
+	}
+}
+
+func TestDecodeWithCommonError(t *testing.T) {
+	err := DecodeWithCommonError([]byte(errData), "Send")
+	if err == nil {
+		t.Error("DecodeWithCommonError should return error")
+		return
+	}
+
+	cErr, ok := err.(*CommonError)
+	if !ok {
+		t.Errorf("DecodeWithCommonError should return *CommonError but %T", err)
+		return
+	}
+	if !(cErr.ErrCode == 43101 && cErr.ErrMsg == "user refuse to accept the msg" && cErr.Error() == expectError) {
+		t.Error("DecodeWithCommonError return bad *CommonError")
+		return
+	}
+}
+
+func TestDecodeWithError(t *testing.T) {
+	type DE struct {
+		CommonError
+	}
+	var obj DE
+	err := DecodeWithError([]byte(errData), &obj, "Send")
+	if err == nil {
+		t.Error("DecodeWithError should return error")
+		return
+	}
+
+	cErr, ok := err.(*CommonError)
+	if !ok {
+		t.Errorf("DecodeWithError should return *CommonError but %T", err)
+		return
+	}
+	if !(cErr.ErrCode == 43101 && cErr.ErrMsg == "user refuse to accept the msg" && cErr.Error() == expectError) {
+		t.Error("DecodeWithError return bad *CommonError")
+		return
+	}
+}