Refactor mock connection open/close logic

This commit is contained in:
Ian Tan 2017-11-17 12:29:06 +08:00
parent f5319a00fa
commit 36170724dd
3 changed files with 42 additions and 27 deletions

View File

@ -1,14 +1,11 @@
package gorm package gorm
import ( import (
"database/sql"
"fmt" "fmt"
) )
// TestHelper is the exported struct used for setting expectations // TestHelper is the exported struct used for setting expectations
type TestHelper struct { type TestHelper struct {
gormDb *DB
mockDb *sql.DB
adapter Adapter adapter Adapter
asserter Asserter asserter Asserter
} }
@ -29,24 +26,35 @@ func (h *TestHelper) ExpectFind(model interface{}) {
// NewTestHelper returns a fresh TestHelper with an arbitary Adapter // NewTestHelper returns a fresh TestHelper with an arbitary Adapter
func NewTestHelper(adapter Adapter) (error, *DB, *TestHelper) { func NewTestHelper(adapter Adapter) (error, *DB, *TestHelper) {
err, mockDb, gormDb, asserter := adapter.Open() err, asserter := adapter.Open()
if err != nil { if err != nil {
return err, nil, nil return err, nil, nil
} }
return nil, gormDb, &TestHelper{gormDb: gormDb, mockDb: mockDb, adapter: adapter, asserter: asserter} gormDb, err := Open("sqlmock", "mock_gorm_dsn")
if err != nil {
return err, nil, nil
}
return nil, gormDb, &TestHelper{adapter: adapter, asserter: asserter}
} }
// NewDefaultTestHelper returns a TestHelper powered by go-sqlmock // NewDefaultTestHelper returns a TestHelper powered by go-sqlmock
func NewDefaultTestHelper() (error, *DB, *TestHelper) { func NewDefaultTestHelper() (error, *DB, *TestHelper) {
adapter := &SqlmockAdapter{} adapter := &SqlmockAdapter{}
err, mockDb, gormDb, asserter := adapter.Open() err, asserter := adapter.Open()
if err != nil { if err != nil {
return err, nil, nil return err, nil, nil
} }
return nil, gormDb, &TestHelper{gormDb: gormDb, mockDb: mockDb, adapter: adapter, asserter: asserter} gormDb, err := Open("sqlmock", "mock_gorm_dsn")
if err != nil {
return err, nil, nil
}
return nil, gormDb, &TestHelper{adapter: adapter, asserter: asserter}
} }

View File

@ -7,30 +7,28 @@ import (
) )
type Adapter interface { type Adapter interface {
Open() (error, *sql.DB, *DB, Asserter) Open() (error, Asserter)
Close() error Close() error
} }
// SqlmockAdapter implemenets the Adapter interface using go-sqlmock
// it is the default Adapter
type SqlmockAdapter struct { type SqlmockAdapter struct {
mockDb *sql.DB mockDb *sql.DB
mock *sqlmock.Sqlmock mock *sqlmock.Sqlmock
} }
// Open returns the raw sql.DB and a gorm DB instance // Open returns the raw sql.DB instance and an Asserter
func (adapter *SqlmockAdapter) Open() (error, *sql.DB, *DB, Asserter) { func (adapter *SqlmockAdapter) Open() (error, Asserter) {
mockDb, mock, err := sqlmock.NewWithDSN("mock_gorm_dsn") mockDb, mock, err := sqlmock.NewWithDSN("mock_gorm_dsn")
if err != nil { adapter.mockDb = mockDb
return err, nil, nil, nil
}
gormDb, err := Open("sqlmock", "mock_gorm_dsn")
if err != nil { if err != nil {
return err, nil, nil, nil return err, nil
} }
return nil, mockDb, gormDb, &SqlmockAsserter{mock: mock, sqlmockDB: mockDb} return nil, &SqlmockAsserter{mock: mock, sqlmockDB: mockDb}
} }
func (adapter *SqlmockAdapter) Close() error { func (adapter *SqlmockAdapter) Close() error {

View File

@ -6,21 +6,30 @@ import (
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
) )
var helper *gorm.TestHelper func TestHelperOpen(t *testing.T) {
var mockDb *gorm.DB err, helper, db := gorm.NewTestHelper(&gorm.SqlmockAdapter{})
func TestOpenWithSqlmock(t *testing.T) { defer func() {
err, db, h := gorm.NewTestHelper(&gorm.SqlmockAdapter{}) helper.Close()
db.Close()
}()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
helper = h
mockDb = db
} }
func TestQuery(t *testing.T) { func TestHelperClose(t *testing.T) {
helper.ExpectFirst(&User{}).Return(&User{}) err, helper, _ := gorm.NewTestHelper(&gorm.SqlmockAdapter{})
mockDb.First(&User{})
closeErr := helper.Close()
if err != nil {
t.Fatal(closeErr)
}
} }
// func TestQuery(t *testing.T) {
// helper.ExpectFirst(&User{}).Return(&User{})
// mockDb.First(&User{})
// }