92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
|
|
package processors
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestErrorsJoin_Is(t *testing.T) {
|
||
|
|
// 创建一个参数验证错误
|
||
|
|
originalErr := errors.New("字段验证失败")
|
||
|
|
joinedErr := errors.Join(ErrInvalidParam, originalErr)
|
||
|
|
|
||
|
|
// 测试 errors.Is 是否能正确识别错误类型
|
||
|
|
if !errors.Is(joinedErr, ErrInvalidParam) {
|
||
|
|
t.Errorf("errors.Is(joinedErr, ErrInvalidParam) 应该返回 true")
|
||
|
|
}
|
||
|
|
|
||
|
|
if errors.Is(joinedErr, ErrSystem) {
|
||
|
|
t.Errorf("errors.Is(joinedErr, ErrSystem) 应该返回 false")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试错误消息
|
||
|
|
expectedMsg := "参数校验不正确\n字段验证失败"
|
||
|
|
if joinedErr.Error() != expectedMsg {
|
||
|
|
t.Errorf("错误消息不匹配,期望: %s, 实际: %s", expectedMsg, joinedErr.Error())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestErrorsJoin_Unwrap(t *testing.T) {
|
||
|
|
originalErr := errors.New("原始错误")
|
||
|
|
joinedErr := errors.Join(ErrSystem, originalErr)
|
||
|
|
|
||
|
|
// 测试 Unwrap - errors.Join 的 Unwrap 行为
|
||
|
|
// errors.Join 的 Unwrap 可能返回 nil 或者第一个错误,这取决于实现
|
||
|
|
// 我们主要关心 errors.Is 是否能正确工作
|
||
|
|
if !errors.Is(joinedErr, ErrSystem) {
|
||
|
|
t.Errorf("errors.Is(joinedErr, ErrSystem) 应该返回 true")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestErrorsJoin_MultipleErrors(t *testing.T) {
|
||
|
|
err1 := errors.New("错误1")
|
||
|
|
err2 := errors.New("错误2")
|
||
|
|
joinedErr := errors.Join(ErrNotFound, err1, err2)
|
||
|
|
|
||
|
|
// 测试 errors.Is 识别多个错误类型
|
||
|
|
if !errors.Is(joinedErr, ErrNotFound) {
|
||
|
|
t.Errorf("errors.Is(joinedErr, ErrNotFound) 应该返回 true")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 测试错误消息
|
||
|
|
expectedMsg := "查询为空\n错误1\n错误2"
|
||
|
|
if joinedErr.Error() != expectedMsg {
|
||
|
|
t.Errorf("错误消息不匹配,期望: %s, 实际: %s", expectedMsg, joinedErr.Error())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestErrorsJoin_RealWorldScenario(t *testing.T) {
|
||
|
|
// 模拟真实的处理器错误场景
|
||
|
|
validationErr := errors.New("手机号格式不正确")
|
||
|
|
processorErr := errors.Join(ErrInvalidParam, validationErr)
|
||
|
|
|
||
|
|
// 在应用服务层,现在应该可以正确识别错误类型
|
||
|
|
if !errors.Is(processorErr, ErrInvalidParam) {
|
||
|
|
t.Errorf("应用服务层应该能够识别 ErrInvalidParam")
|
||
|
|
}
|
||
|
|
|
||
|
|
// 错误消息应该包含两种信息
|
||
|
|
errorMsg := processorErr.Error()
|
||
|
|
if !contains(errorMsg, "参数校验不正确") {
|
||
|
|
t.Errorf("错误消息应该包含错误类型: %s", errorMsg)
|
||
|
|
}
|
||
|
|
if !contains(errorMsg, "手机号格式不正确") {
|
||
|
|
t.Errorf("错误消息应该包含原始错误: %s", errorMsg)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 辅助函数:检查字符串是否包含子字符串
|
||
|
|
func contains(s, substr string) bool {
|
||
|
|
return len(s) >= len(substr) && (s == substr ||
|
||
|
|
(len(s) > len(substr) && (s[:len(substr)] == substr ||
|
||
|
|
s[len(s)-len(substr):] == substr ||
|
||
|
|
func() bool {
|
||
|
|
for i := 1; i <= len(s)-len(substr); i++ {
|
||
|
|
if s[i:i+len(substr)] == substr {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}())))
|
||
|
|
}
|