Heim  >  Artikel  >  Backend-Entwicklung  >  Testen mit Gorm und SQLMock

Testen mit Gorm und SQLMock

王林
王林nach vorne
2024-02-05 21:39:091123Durchsuche

使用 gorm 和 sqlmock 进行测试

Frageninhalt

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?


Richtige Antwort


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 (expectbeginexpectcommit 围绕删除),查询是使用参数进行的(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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen