sqlmock is not matching query, but query is identical and log output shows the same

前端 未结 3 1882
南方客
南方客 2021-01-18 07:20

I\'m trying to write tests for some code using Gorm using sqlmock. I figured out writing tests for my insert function but now pulling my hair out trying to get an update wor

3条回答
  •  难免孤独
    2021-01-18 07:33

    This is a strange solution but worked for me. Probably a bug in sqlmock. Duplicate your mockedRow variable and plug them in ExpectQuery.

    mockedRow := sqlmock.NewRows([]string{"id", "created_at", "updated_at", "poolid"}).AddRow(1, time.Now(), time.Now(), "1")
    mockedRow2 := sqlmock.NewRows([]string{"id", "created_at", "updated_at", "poolid"}).AddRow(1, time.Now(), time.Now(), "1")
    
            // Mock the complete transaction
            mock.ExpectQuery(`SELECT * FROM "storage_pools"  WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1`).
                WithArgs(c.givenPool.PoolId).
                WillReturnRows(mockedRow)
    
            mock.ExpectQuery(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND "storage_pools"."id" = ? AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC`).
                WithArgs(1, c.givenPool.PoolId).
                WillReturnRows(mockedRow2)
    

    Alternatively you can create an array of mockedRow as follows:

    mockedRow := []*sqlmock.Rows{
    sqlmock.NewRows([]string{"id", "created_at", "updated_at", "poolid"}).AddRow(1, time.Now(), time.Now(), "1"),
    sqlmock.NewRows([]string{"id", "created_at", "updated_at", "poolid"}).AddRow(1, time.Now(), time.Now(), "1"),
    }
    And use it as WillReturnRows(mockedRow[0]) and WillReturnRows(mockedRow[1])
    

提交回复
热议问题