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
import (
"database/sql"
"fmt"
)
// TestHelper is the exported struct used for setting expectations
type TestHelper struct {
gormDb *DB
mockDb *sql.DB
adapter Adapter
asserter Asserter
}
@ -29,24 +26,35 @@ func (h *TestHelper) ExpectFind(model interface{}) {
// NewTestHelper returns a fresh TestHelper with an arbitary Adapter
func NewTestHelper(adapter Adapter) (error, *DB, *TestHelper) {
err, mockDb, gormDb, asserter := adapter.Open()
err, asserter := adapter.Open()
if err != 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
func NewDefaultTestHelper() (error, *DB, *TestHelper) {
adapter := &SqlmockAdapter{}
err, mockDb, gormDb, asserter := adapter.Open()
err, asserter := adapter.Open()
if err != 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 {
Open() (error, *sql.DB, *DB, Asserter)
Open() (error, Asserter)
Close() error
}
// SqlmockAdapter implemenets the Adapter interface using go-sqlmock
// it is the default Adapter
type SqlmockAdapter struct {
mockDb *sql.DB
mock *sqlmock.Sqlmock
}
// Open returns the raw sql.DB and a gorm DB instance
func (adapter *SqlmockAdapter) Open() (error, *sql.DB, *DB, Asserter) {
// Open returns the raw sql.DB instance and an Asserter
func (adapter *SqlmockAdapter) Open() (error, Asserter) {
mockDb, mock, err := sqlmock.NewWithDSN("mock_gorm_dsn")
if err != nil {
return err, nil, nil, nil
}
gormDb, err := Open("sqlmock", "mock_gorm_dsn")
adapter.mockDb = mockDb
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 {

View File

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