go-sqlmock icon indicating copy to clipboard operation
go-sqlmock copied to clipboard

How do I test the results after an update query?

Open mchen628 opened this issue 5 years ago • 2 comments
trafficstars

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 avatar Jul 30 '20 23:07 mchen628

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

mchen628 avatar Jul 30 '20 23:07 mchen628

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

l3pp4rd avatar Jul 31 '20 17:07 l3pp4rd