重构 #4
| @@ -20,9 +20,9 @@ func captureOutput(cfg config.LogConfig) (*logs.Logger, *bytes.Buffer) { | |||||||
| 	var buf bytes.Buffer | 	var buf bytes.Buffer | ||||||
| 	// 使用一个简单的 Console Encoder 进行测试,方便断言字符串 | 	// 使用一个简单的 Console Encoder 进行测试,方便断言字符串 | ||||||
| 	encoderConfig := zap.NewDevelopmentEncoderConfig() | 	encoderConfig := zap.NewDevelopmentEncoderConfig() | ||||||
| 	encoderConfig.EncodeTime = nil                          // 忽略时间,避免测试结果不一致 | 	encoderConfig.EncodeTime = nil // 忽略时间,避免测试结果不一致 | ||||||
| 	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder // 日志级别大写 | 	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder | ||||||
| 	encoderConfig.EncodeCaller = nil                        // 忽略调用者信息 | 	encoderConfig.EncodeCaller = nil // 忽略调用者信息 | ||||||
| 	encoder := zapcore.NewConsoleEncoder(encoderConfig) | 	encoder := zapcore.NewConsoleEncoder(encoderConfig) | ||||||
|  |  | ||||||
| 	writer := zapcore.AddSync(&buf) | 	writer := zapcore.AddSync(&buf) | ||||||
| @@ -68,7 +68,7 @@ func TestLogger_Write_ForGin(t *testing.T) { | |||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	output := buf.String() | 	output := buf.String() | ||||||
| 	// logger.Write 会将 gin 的日志转为 info 级别 | 	// logger.Write 会将 gin 的日志转为 info 级别 | ||||||
| 	assert.Contains(t, output, "INFO", "应包含 INFO 级别") | 	assert.Contains(t, output, "INFO") | ||||||
| 	assert.Contains(t, output, strings.TrimSpace(ginLog)) | 	assert.Contains(t, output, strings.TrimSpace(ginLog)) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -84,7 +84,7 @@ func TestGormLogger(t *testing.T) { | |||||||
| 		return sql, rows | 		return sql, rows | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	t.Run("慢查询", func(t *testing.T) { | 	t.Run("Slow Query", func(t *testing.T) { | ||||||
| 		buf.Reset() | 		buf.Reset() | ||||||
| 		// 模拟一个耗时超过 200ms 的查询 | 		// 模拟一个耗时超过 200ms 的查询 | ||||||
| 		begin := time.Now().Add(-300 * time.Millisecond) | 		begin := time.Now().Add(-300 * time.Millisecond) | ||||||
| @@ -92,37 +92,36 @@ func TestGormLogger(t *testing.T) { | |||||||
|  |  | ||||||
| 		output := buf.String() | 		output := buf.String() | ||||||
| 		assert.Contains(t, output, "WARN", "应包含 WARN 级别") | 		assert.Contains(t, output, "WARN", "应包含 WARN 级别") | ||||||
| 		assert.Contains(t, output, "[GORM] 慢查询", "应包含慢查询信息") | 		assert.Contains(t, output, "[GORM] slow query", "应包含慢查询信息") | ||||||
| 		// 修复:不再检查严格的 JSON 格式,只检查关键内容 |  | ||||||
| 		assert.Contains(t, output, "SELECT * FROM users WHERE id = 1", "应包含 SQL 语句") | 		assert.Contains(t, output, "SELECT * FROM users WHERE id = 1", "应包含 SQL 语句") | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	t.Run("错误查询", func(t *testing.T) { | 	t.Run("Error Query", func(t *testing.T) { | ||||||
| 		buf.Reset() | 		buf.Reset() | ||||||
| 		queryError := errors.New("语法错误") | 		queryError := errors.New("syntax error") | ||||||
| 		gormLogger.Trace(ctx, time.Now(), fc, queryError) | 		gormLogger.Trace(ctx, time.Now(), fc, queryError) | ||||||
|  |  | ||||||
| 		output := buf.String() | 		output := buf.String() | ||||||
| 		assert.Contains(t, output, "ERROR", "应包含 ERROR 级别") | 		assert.Contains(t, output, "ERROR") | ||||||
| 		assert.Contains(t, output, "[GORM] 错误: 语法错误", "应包含 GORM 错误信息") | 		assert.Contains(t, output, "[GORM] error: syntax error") | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	t.Run("记录未找到错误被跳过", func(t *testing.T) { | 	t.Run("Record Not Found Error is Skipped", func(t *testing.T) { | ||||||
| 		buf.Reset() | 		buf.Reset() | ||||||
| 		queryError := errors.New("记录未找到") // 模拟 GORM 的 RecordNotFound 错误 | 		// 错误必须包含 "record not found" 字符串以匹配 logs.go 中的判断逻辑 | ||||||
|  | 		queryError := errors.New("record not found") | ||||||
| 		gormLogger.Trace(ctx, time.Now(), fc, queryError) | 		gormLogger.Trace(ctx, time.Now(), fc, queryError) | ||||||
|  |  | ||||||
| 		// 在修复 logs.go 中的 bug 后,这里应该为空 |  | ||||||
| 		assert.Empty(t, buf.String(), "开启 SkipErrRecordNotFound 后,record not found 错误不应产生任何日志") | 		assert.Empty(t, buf.String(), "开启 SkipErrRecordNotFound 后,record not found 错误不应产生任何日志") | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	t.Run("正常查询", func(t *testing.T) { | 	t.Run("Normal Query", func(t *testing.T) { | ||||||
| 		buf.Reset() | 		buf.Reset() | ||||||
| 		// 模拟一个快速查询 | 		// 模拟一个快速查询 | ||||||
| 		gormLogger.Trace(ctx, time.Now(), fc, nil) | 		gormLogger.Trace(ctx, time.Now(), fc, nil) | ||||||
|  |  | ||||||
| 		output := buf.String() | 		output := buf.String() | ||||||
| 		assert.Contains(t, output, "DEBUG", "正常查询应为 DEBUG 级别") | 		assert.Contains(t, output, "DEBUG") // 正常查询是 Debug 级别 | ||||||
| 		assert.Contains(t, output, "[GORM] 追踪", "应包含 GORM 追踪信息") | 		assert.Contains(t, output, "[GORM] trace") | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user