Support mock has one

This commit is contained in:
Ian Tan 2017-11-22 15:44:06 +08:00
parent 8ae27d7ec7
commit a0b70669e7
2 changed files with 48 additions and 3 deletions

View File

@ -5,6 +5,7 @@ import (
"fmt"
"reflect"
"github.com/davecgh/go-spew/spew"
sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1"
)
@ -69,7 +70,25 @@ func getRelationRows(rVal reflect.Value, fieldName string, relation *Relationshi
)
switch relation.Kind {
case "has_one":
// just a plain struct
scope := &Scope{Value: rVal.Interface()}
for _, field := range scope.GetModelStruct().StructFields {
if field.IsNormal {
columns = append(columns, field.DBName)
}
}
rows = sqlmock.NewRows(columns)
// we don't have a slice
row := getRowForFields(scope.Fields())
rows = rows.AddRow(row...)
return rows, true
case "has_many", "many_to_many":
// in this case, we're guarnateed to have a slice
elem := rVal.Type().Elem()
scope := &Scope{Value: reflect.New(elem).Interface()}
@ -165,6 +184,7 @@ func (q *SqlmockQuery) Returns(out interface{}) ExpectedQuery {
for i, query := range q.queries {
query.WillReturnRows(rows[i])
spew.Dump(query)
}
return q

View File

@ -145,6 +145,31 @@ func TestMockPreloadHasMany(t *testing.T) {
}
}
func TestMockPreloadHasOne(t *testing.T) {
db, expect, err := gorm.NewDefaultExpecter()
defer func() {
db.Close()
}()
if err != nil {
t.Fatal(err)
}
in := User{Id: 1}
out := User{Id: 1, CreditCard: CreditCard{Number: "12345678"}}
expect.Preload("CreditCard").Find(&in).Returns(out)
db.Preload("CreditCard").Find(&in)
if err := expect.AssertExpectations(); err != nil {
t.Error(err)
}
if !reflect.DeepEqual(in, out) {
t.Error("In and out are not equal")
}
}
func TestMockPreloadMany2Many(t *testing.T) {
db, expect, err := gorm.NewDefaultExpecter()
defer func() {
@ -166,7 +191,7 @@ func TestMockPreloadMany2Many(t *testing.T) {
t.Error(err)
}
// if !reflect.DeepEqual(in, out) {
// t.Error("In and out are not equal")
// }
// if !reflect.DeepEqual(in, out) {
// t.Error("In and out are not equal")
// }
}