// Package task_test 包含对 task 包的单元测试 package task_test import ( "sync" "sync/atomic" "testing" "time" "git.huangwc.com/pig/pig-farm-controller/internal/infra/config" "git.huangwc.com/pig/pig-farm-controller/internal/infra/logs" ) // testLogger 是一个用于所有测试用例的静默 logger 实例。 var testLogger *logs.Logger func init() { // 使用 "fatal" 级别来创建一个在测试期间不会产生任何输出的 logger。 // 这避免了在运行 `go test` 时被日志淹没。 cfg := config.LogConfig{Level: "fatal"} testLogger = logs.NewLogger(cfg) } // MockTask 用于测试的模拟任务 type MockTask struct { id string priority int isDone bool execute func() error executed int32 // 使用原子操作来跟踪执行次数 } // Execute 实现了 Task 接口,并确保每次调用都增加执行计数 func (m *MockTask) Execute() error { atomic.AddInt32(&m.executed, 1) if m.execute != nil { return m.execute() } return nil } func (m *MockTask) GetID() string { return m.id } func (m *MockTask) GetPriority() int { return m.priority } func (m *MockTask) IsDone() bool { return m.isDone } // ExecutedCount 返回任务被执行的次数 func (m *MockTask) ExecutedCount() int32 { return atomic.LoadInt32(&m.executed) } func (m *MockTask) GetDescription() string { return "Mock Task" } // --- 健壮等待的辅助函数 --- func waitForWaitGroup(t *testing.T, wg *sync.WaitGroup, timeout time.Duration) { waitChan := make(chan struct{}) go func() { defer close(waitChan) wg.Wait() }() select { case <-waitChan: // 等待成功 case <-time.After(timeout): t.Fatal("等待任务完成超时") } }