Ich habe einen gRPC-Dienst mit MySQL und muss Datensätze nach jedem Testfall löschen. Ich versuche, jeden Testfall mit einer Transaktion zu verbinden. Es funktioniert, wenn es keine Transaktion in meinem RPC-Code gibt, aber fehlschlägt, wenn es gibt. Und es wird seinen Fehler wie:Wie go-Code zu testen, der Datenbanken (MySQL) verwendet?
can't start transaction
...
sql: Transaction has already been committed or rolled back
Dann versuche ich truncate zu verwenden, um die Aufzeichnungen zu löschen, aber einige der Testfälle nicht zufällig.
Mein Code ist wie (I gorm verwenden):
func foo(db *gorm.DB) {
tx := db.Begin()
// query and insert
tx.Commit()
}
// Use transaction to do database cleanup
func TestFooVersion1() {
testDB := initDB()
tx = testDB.Begin() // setup
foo(testDB)
tx.Rollback() // teardown
}
// Use truncate to do database cleanup
func TestFooVersion2() {
testDB := initDB()
foo(testDB)
truncateTables(testDB) // teardown
}
func truncateTables(db *gorm.DB) {
// exec "TRUNCATE TABLE table;" for every table
}
Was ein richtiger Weg ist, den Code mit DB (MySQL) zu testen? (Ich mag nicht wie Go-sqlmock)
Ich habe einen Beispielcode hinzugefügt. Das Problem ist, dass die Transaktion nicht funktioniert, wenn ich eine Transaktion im getesteten Code verwende (wie die "foo" -Funktion). –