Skip to content

Instantly share code, notes, and snippets.

@helloteemo
Created July 12, 2022 06:59
Show Gist options
  • Save helloteemo/26bd15b0ee854b171980bbe834357647 to your computer and use it in GitHub Desktop.
Save helloteemo/26bd15b0ee854b171980bbe834357647 to your computer and use it in GitHub Desktop.
Go单元测试常见写法
package sql_test
import "gorm.io/gorm"
// code
type User struct {
ID int
Name string
}
func findByID(db *gorm.DB, userId int) (u User, exists bool, err error) {
err = db.Where(`id = ?`, userId).First(&u).Error
if gorm.ErrRecordNotFound == err {
return u, false, nil
}
if err != nil {
return u, false, err
}
return u, true, nil
}
package sql_test
import (
"github.com/DATA-DOG/go-sqlmock"
"github.com/smartystreets/goconvey/convey"
"github.com/stretchr/testify/assert"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"testing"
)
func Test_findByID(t *testing.T) {
db, mock, err := sqlmock.New()
assert.Nil(t, err)
assert.NotNil(t, db)
gormDB, err := gorm.Open(mysql.New(mysql.Config{Conn: db, SkipInitializeWithVersion: true}), &gorm.Config{})
assert.Nil(t, err)
assert.NotNil(t, gormDB)
convey.Convey("Err", t, func() {
mock.ExpectQuery("(?i)SELECT.*").WithArgs(1).WillReturnError(gorm.ErrInvalidDB)
_, _, err := findByID(gormDB, 1)
assert.NotNil(t, err)
assert.EqualValues(t, err, gorm.ErrInvalidDB)
})
convey.Convey("not exists", t, func() {
mock.ExpectQuery("(?i)SELECT.*").WithArgs(2).WillReturnError(gorm.ErrRecordNotFound)
user, exists, err := findByID(gormDB, 2)
assert.Nil(t, err)
assert.False(t, exists)
assert.EqualValues(t, user.ID, 0)
assert.EqualValues(t, user.Name, ``)
})
convey.Convey("Err", t, func() {
mock.ExpectQuery("(?i)SELECT.*").WithArgs(3).WillReturnRows(sqlmock.NewRows(
[]string{`id`, `name`}).AddRow(3, `teemo`))
user, exists, err := findByID(gormDB, 3)
assert.Nil(t, err)
assert.True(t, exists)
assert.EqualValues(t, user.ID, 3)
assert.EqualValues(t, user.Name, `teemo`)
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment