Heim >Backend-Entwicklung >Golang >Testen mit Gorm und SQLMock
Ich versuche, einen Test für meine Go-Lambda-Funktion mit sqlmock und gorm zu schreiben.
Das ist die Funktion, die ich testen möchte:
func docleanup(con *gorm.db) { sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01") con.where("date_to <= ?", sixmonthsago).delete(&availability{}) con.where("date_to <= ?", sixmonthsago).delete(&reservation{}) }
Das ist mein Test:
func testdocleanup(m *testing.t) { var mock sqlmock.sqlmock var db *sql.db var err error db, mock, err = sqlmock.new() assert.nil(m, err) dialector := mysql.new(mysql.config{ dsn: "sqlmock_db_0", drivername: "mysql", conn: db, skipinitializewithversion: true, }) conn, err := gorm.open(dialector, &gorm.config{}) if err != nil { m.errorf("failed to open connection to db: %v", err) } if conn == nil { m.error("failed to open connection to db: conn is nil") } defer db.close() mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01"))) mock.expectquery(fmt.sprintf("delete from reservations where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01"))) docleanup(conn) err = mock.expectationsweremet() assert.nil(m, err) }
Ich weiß nicht, was ich falsch gemacht habe. Dies ist das erste Mal, dass ich sqlmock verwende. Ich habe einige Stellen gelesen und mein Code sieht gut aus, aber ich erhalte keine Ergebnisse. Mein Fehler war:
Expected nil, but got: &errors.errorString{s:"there is a remaining expectation which was not matched: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n - is without arguments"}
Irgendeine Idee, was ich falsch gemacht habe?
Das Hauptproblem, das ich sehe, liegt in der Art und Weise, wie Sie die Abfrage erwarten. statt
mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))
Sie sollten Folgendes haben:
mock.expectbegin() mock.expectexec("delete from `availability` where date_to <= ?"). withargs(time.now().adddate(0, -6, 0).format("2006-02-01")). willreturnresult(sqlmock.newresult(0, 0)) mock.expectcommit()
Dadurch wird der Simulation mitgeteilt, dass Sie Transaktionen verwenden (expectbegin
和 expectcommit
围绕删除),查询是使用参数进行的(withargs
),以及查询的返回结果是什么(willreturnresult
)
Es gibt einige andere subtile Änderungen, wie „“ um den Tabellennamen (MySQL-Idiom) und den Tabellennamen (gorm wird den Namen normalerweise pluralisieren, sodass Sie sich entweder in availability
上实现 tablename
befinden oder standardmäßig die Verfügbarkeit verwenden).
Der beste Weg, all diese Probleme zu erkennen, besteht darin, docleanup
zu ändern, um Fehler zurückzugeben, und sie dann in Ihren Tests zu sehen:
func docleanup(con *gorm.db) error { sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01") tx := con.where("date_to <= ?", sixmonthsago).delete(&availability{}) if tx.error != nil { return tx.error } tx = con.where("date_to <= ?", sixmonthsago).delete(&reservation{}) if tx.error != nil { return tx.error } return nil } ... err = docleanup(conn) assert.nil(m, err) ...
Tun Sie dies und verwenden Sie den aktuellen Code und Sie erhalten
Expected nil, but got: &errors.errorString{s:"call to database transaction Begin, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n - is without arguments"}
Dies sagt Ihnen, dass sqlmock keinen Start erwartet, und wenn Sie dies beheben, erhalten Sie die anderen Fehler, die im ersten Teil dieser Antwort behandelt werden.
Das obige ist der detaillierte Inhalt vonTesten mit Gorm und SQLMock. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!