DATA-DOG / go-sqlmock

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

Query with WHERE IN shows an error (using sqlx) #287

Closed devFallingstar closed 1 year ago

devFallingstar commented 2 years ago

Hello sqlmock teams. First of all, thanks to this awesome project. It makes me more easier to implement test code with sql system 👍 But I got an arguments do not match error while running SELECT WHERE IN queries in my code.

When I run below test codes on sqlmock environment:

// Test code
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
sqlxDB := sqlx.NewDb(db, "sqlmock")
wantRows := sqlmock.NewRows([]string{"id", "value"}).
            AddRow("key1", "value1").
            AddRow("key2", "value2")

mock.ExpectQuery(fmt.Sprintf("SELECT * FROM %s WHERE id IN (?, ?)", tableName)).
            WithArgs("key1", "key2").
            WillReturnRows(wantRows)

GetFeatures(tableName, keys) // keys = ["key1", "key2"]

func GetFeatures(tableName, keys) {
    query, args, err1 := sqlx.In(fmt.Sprintf(`SELECT * FROM %s WHERE id IN (?)`, tableName), keys)

    // Processing err1 here

    query = sqlxDB.Rebind(query)
    rows, err2 := sqlxDB.Queryx(query, args...)

    // Processing err2 here
}

err2 shows an error :

Query 'SELECT * FROM tableName WHERE id IN (?, ?)', arguments do not match: expected 1, but got 2 arguments

Besides, when I run exact same code with a real MySQL DB server which running locally, it doesn't give any other errors. It runs correctly. I think sqlmock doesn't support SELECT WHERE IN but I'm not sure about it. Is there any way to fix those error?

Any help will be appreciate. 😄

fatelei commented 2 years ago

there is no error, this is a test code: https://go.dev/play/p/23Lgj-9W93o