package testutil import ( "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/require" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "micro-bundle/pkg/app" "micro-bundle/pkg/db" ) // SetupTaskBenchDB 创建一个 sqlmock 驱动的 *gorm.DB,挂到 app.ModuleClients.TaskBenchDB。 // 返回的 sqlmock 用于在测试中声明期望 SQL,cleanup 自动还原全局单例。 // // 使用 QueryMatcherRegexp 匹配,SQL 文本作为正则匹配(支持 .* 等), // 避免对 gorm 生成 SQL 的细节(字段顺序、占位符数量)过度耦合。 func SetupTaskBenchDB(t *testing.T) sqlmock.Sqlmock { t.Helper() mockDB, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherRegexp)) require.NoError(t, err) gormDB, err := gorm.Open(mysql.New(mysql.Config{ Conn: mockDB, SkipInitializeWithVersion: true, }), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, DisableForeignKeyConstraintWhenMigrating: true, }) require.NoError(t, err) original := app.ModuleClients app.ModuleClients = &app.App{ Lg: zap.NewNop(), TaskBenchDB: &db.TaskBenchDB{DB: gormDB}, } t.Cleanup(func() { app.ModuleClients = original }) return mock }