diff --git a/expectations_go18.go b/expectations_go18.go index 5fade37..9db852f 100644 --- a/expectations_go18.go +++ b/expectations_go18.go @@ -30,6 +30,7 @@ func (e *ExpectedQuery) WillReturnRows(rows ...*Rows) *ExpectedQuery { } func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error { + errMsgFmt := "\nwant\n %d\n got\n %d\n arguments" if nil == e.args { if e.noArgs && len(args) > 0 { return fmt.Errorf("expected 0, but got %d arguments", len(args)) @@ -37,7 +38,7 @@ func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error { return nil } if len(args) != len(e.args) { - return fmt.Errorf("expected %d, but got %d arguments", len(e.args), len(args)) + return fmt.Errorf(errMsgFmt, len(e.args), len(args)) } // @TODO should we assert either all args are named or ordinal? for k, v := range args { @@ -54,7 +55,7 @@ func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error { if named, isNamed := dval.(sql.NamedArg); isNamed { dval = named.Value if v.Name != named.Name { - return fmt.Errorf("named argument %d: name: \"%s\" does not match expected: \"%s\"", k, v.Name, named.Name) + return fmt.Errorf("named argument %d: name: '%s' does not match expected: '%s'", k, v.Name, named.Name) } } else if k+1 != v.Ordinal { return fmt.Errorf("argument %d: ordinal position: %d does not match expected: %d", k, k+1, v.Ordinal) @@ -67,12 +68,28 @@ func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error { } if !reflect.DeepEqual(darg, v.Value) { - return fmt.Errorf("argument %d expected [%T - %+v] does not match actual [%T - %+v]", k, darg, darg, v.Value, v.Value) + + return fmt.Errorf("Summary:\nargument %d \nwant: \n type '%T' \n value '%+v' \ngot: \n type '%T' \n value '%+v'", + k, + darg, + darg, + v.Value, + v.Value) } } return nil } +func errorFormat(argIndex int, expectedType interface{}, expectedValue interface{}, actualType interface{}, actualValue interface{}) error { + return fmt.Errorf("Argument %d \nExpected: \n\tType: '%T' \n\tValue: '%+v' \nReceived: \n\tType: '%T' \n\tValue: '%+v'", + argIndex, + expectedType, + expectedType, + actualType, + actualType) +} + + func (e *queryBasedExpectation) attemptArgMatch(args []driver.NamedValue) (err error) { // catch panic defer func() { diff --git a/sqlmock_before_go18.go b/sqlmock_before_go18.go index 9965e78..7fd5dc6 100644 --- a/sqlmock_before_go18.go +++ b/sqlmock_before_go18.go @@ -94,7 +94,7 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) } if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) + return nil, fmt.Errorf("Query " + ErrMsgFmt, query, err) } expected.triggered = true diff --git a/sqlmock_go18.go b/sqlmock_go18.go index f268900..bbb4166 100644 --- a/sqlmock_go18.go +++ b/sqlmock_go18.go @@ -1,5 +1,4 @@ // +build go1.8 - package sqlmock import ( @@ -242,7 +241,7 @@ func (c *sqlmock) query(query string, args []driver.NamedValue) (*ExpectedQuery, } if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) + return nil, fmt.Errorf("Query " + errMsgFmt, query, err) } expected.triggered = true @@ -278,6 +277,10 @@ func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error) return ex.result, nil } +const ( + errMsgFmt = "'%s', \n\narguments do not match: \n %s" +) + func (c *sqlmock) exec(query string, args []driver.NamedValue) (*ExpectedExec, error) { var expected *ExpectedExec var fulfilled int @@ -324,7 +327,7 @@ func (c *sqlmock) exec(query string, args []driver.NamedValue) (*ExpectedExec, e } if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("ExecQuery '%s', arguments do not match: %s", query, err) + return nil, fmt.Errorf("ExecQuery: " + errMsgFmt, query, err) } expected.triggered = true @@ -333,7 +336,7 @@ func (c *sqlmock) exec(query string, args []driver.NamedValue) (*ExpectedExec, e } if expected.result == nil { - return nil, fmt.Errorf("ExecQuery '%s' with args %+v, must return a database/sql/driver.Result, but it was not set for expectation %T as %+v", query, args, expected, expected) + return nil, fmt.Errorf("\nExecQuery '%s' with args %+v, must return a database/sql/driver.Result, but it was not set for expectation %T as %+v", query, args, expected, expected) } return expected, nil