package dao import ( "context" "fmt" "testing" "time" "model-gateway/consts/public" _ "gitea.redpowerfuture.com/red-future/common/consul" "gitea.redpowerfuture.com/red-future/common/db/gfdb" _ "github.com/gogf/gf/contrib/drivers/pgsql/v2" "github.com/gogf/gf/v2/net/gtrace" ) // TestErrorMemoryDaoGetByKeyMiss 回归:错误记忆未命中必须返回 (nil, nil), // 而非把空记录丢给 r.Struct(&res) 上浮 sql.ErrNoRows —— 否则 service.shouldRetryWithMemory // 会把一切查询错误当 fail-closed,导致 分析→落库→重试 整条链路变死代码。 // 依赖真实 PG;不可达时跳过(不在无 PG 环境硬失败)。 func TestErrorMemoryDaoGetByKeyMiss(t *testing.T) { ctx, span := gtrace.NewSpan(context.Background(), "TestErrorMemoryDaoGetByKeyMiss") defer span.End() // 探测连接:不可用则跳过 if _, err := gfdb.DB(ctx, public.DbNameModelGateway). Model(ctx, public.TableNameErrorMemory). NoTenantId(ctx). Count(); err != nil { t.Skipf("DB不可用,跳过: %v", err) } key := fmt.Sprintf("test-miss-%d", time.Now().UnixNano()) row, err := ErrorMemory.GetByKey(ctx, key) if err != nil { t.Fatalf("GetByKey 未命中不应报错: %v", err) } if row != nil { t.Fatalf("GetByKey 未命中应返回 nil, got %+v", row) } }