var ( sqliteDBConn *gorm.DB ) func GetInMemoryDB() *gorm.DB { return sqliteDBConn } func InitInMemoryDB() { var err error sqliteDBConn, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { panic(err) } }
在單測啟動前,調用 InitInMemoryDB 來初始化,拿到一個基于我們的內存 SQLite 生成的 *gorm.DB 對象,并通過 GetInMemoryDB 返回即可。
對于業務代碼來說,我們只需要傳入這個內存 SQLite 的 *gorm.DB 作為 MySQL 的平替,其他邏輯都不需要改變,非常方便。
當然,Fake 帶來的另一個問題也需要解決。
你既然是 Fake,那等于說是個新的數據庫,并沒有我們此前在線上環境建好的那些數據表,我們如果直接跑測試,INSERT 數據的時候是要報錯的。
此時我們可以直接把自己的 Model 指針傳入 db.AutoMigrate 方法,GORM 會自行幫我們創建相關的表。
這樣,完美替代mysql的數據庫和表,就創建完畢,可以愉快的開始寫單測了