DATA-DOG / go-sqlmock

Sql mock driver for golang to test database interactions
Other
6.05k stars 406 forks source link

How do I test the results after an update query? #233

Closed mchen628 closed 3 months ago

mchen628 commented 4 years ago

Here is my test function. I updated the mocked data, but it's returning the not updated version. `func TestSample(t *testing.T){ db, mock, err := sqlmock.New() if err != nil { t.Errorf("failed to open sqlmock database: %v", err) } defer db.Close()

testRows := sqlmock.NewRows([]string{"user","password"}).
    AddRow("mike", "m123").
    AddRow("chris", "c123")

mock.ExpectBegin()
mock.ExpectPrepare("UPDATE zebra SET user='mike'").ExpectExec().WillReturnResult(sqlmock.NewResult(0,1))
mock.ExpectCommit()
mock.ExpectQuery("SELECT (.+) FROM zebra *").WillReturnRows(testRows)

tx, err := db.Begin()
if err != nil {
    fmt.Printf("Something went wrong in begin: %v", err)
}
sql := "UPDATE zebra SET user='mike' WHERE user='test'"

stmt, err := tx.Prepare(sql)
if err != nil {
    fmt.Printf("Something went wrong in begin: %v", err)
}
defer stmt.Close()

_, err = stmt.Exec()
if err != nil {
    tx.Rollback()
    fmt.Printf("Something went wrong in begin: %v", err)
}
err = tx.Commit()
if err != nil {
    fmt.Printf("Something went wrong in begin: %v", err)
}

rows, err := db.Query("SELECT * FROM zebra")
if err != nil {
    fmt.Printf("Not exepecting error: %v", err)
}
defer rows.Close()
var (
    user string
    password string
)
for rows.Next() {
    err := rows.Scan(&user, &password)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(user, password)
}
err = rows.Err()
if err != nil {
    fmt.Println(err)
}
err = mock.ExpectationsWereMet()
if err != nil {
    fmt.Printf("Unit test failed %v", err)
}

}`

mchen628 commented 4 years ago

The select statement doesn't return the updated data after the update statement.

l3pp4rd commented 4 years ago

Sqlmock is for mocking, it is not a database. You have to mock what it needs to return, given your test scenario