mirror of
https://github.com/stretchr/testify.git
synced 2025-05-31 11:42:44 +00:00
Support nil arguments to Argument Matchers
This commit is contained in:
parent
42baa3e5a4
commit
cbf22d8d28
21
mock/mock.go
21
mock/mock.go
@ -1,6 +1,7 @@
|
|||||||
package mock
|
package mock
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
@ -518,9 +519,25 @@ type argumentMatcher struct {
|
|||||||
|
|
||||||
func (f argumentMatcher) Matches(argument interface{}) bool {
|
func (f argumentMatcher) Matches(argument interface{}) bool {
|
||||||
expectType := f.fn.Type().In(0)
|
expectType := f.fn.Type().In(0)
|
||||||
|
expectTypeNilSupported := false
|
||||||
|
switch expectType.Kind() {
|
||||||
|
case reflect.Interface, reflect.Chan, reflect.Func, reflect.Map, reflect.Slice, reflect.Ptr:
|
||||||
|
expectTypeNilSupported = true
|
||||||
|
}
|
||||||
|
|
||||||
if reflect.TypeOf(argument).AssignableTo(expectType) {
|
argType := reflect.TypeOf(argument)
|
||||||
result := f.fn.Call([]reflect.Value{reflect.ValueOf(argument)})
|
var arg reflect.Value
|
||||||
|
if argType == nil {
|
||||||
|
arg = reflect.New(expectType).Elem()
|
||||||
|
} else {
|
||||||
|
arg = reflect.ValueOf(argument)
|
||||||
|
}
|
||||||
|
|
||||||
|
if argType == nil && !expectTypeNilSupported {
|
||||||
|
panic(errors.New("attempting to call matcher with nil for non-nil expected type"))
|
||||||
|
}
|
||||||
|
if argType == nil || argType.AssignableTo(expectType) {
|
||||||
|
result := f.fn.Call([]reflect.Value{arg})
|
||||||
return result[0].Bool()
|
return result[0].Bool()
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
@ -42,6 +42,26 @@ func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error {
|
|||||||
return args.Error(0)
|
return args.Error(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *TestExampleImplementation) TheExampleMethod4(v ExampleInterface) error {
|
||||||
|
args := i.Called(v)
|
||||||
|
return args.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *TestExampleImplementation) TheExampleMethod5(ch chan struct{}) error {
|
||||||
|
args := i.Called(ch)
|
||||||
|
return args.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *TestExampleImplementation) TheExampleMethod6(m map[string]bool) error {
|
||||||
|
args := i.Called(m)
|
||||||
|
return args.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *TestExampleImplementation) TheExampleMethod7(slice []bool) error {
|
||||||
|
args := i.Called(slice)
|
||||||
|
return args.Error(0)
|
||||||
|
}
|
||||||
|
|
||||||
func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error {
|
func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error {
|
||||||
args := i.Called(fn)
|
args := i.Called(fn)
|
||||||
return args.Error(0)
|
return args.Error(0)
|
||||||
@ -181,15 +201,20 @@ func Test_Mock_On_WithPtrArgMatcher(t *testing.T) {
|
|||||||
var mockedService TestExampleImplementation
|
var mockedService TestExampleImplementation
|
||||||
|
|
||||||
mockedService.On("TheExampleMethod3",
|
mockedService.On("TheExampleMethod3",
|
||||||
MatchedBy(func(a *ExampleType) bool { return a.ran == true }),
|
MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == true }),
|
||||||
).Return(nil)
|
).Return(nil)
|
||||||
|
|
||||||
mockedService.On("TheExampleMethod3",
|
mockedService.On("TheExampleMethod3",
|
||||||
MatchedBy(func(a *ExampleType) bool { return a.ran == false }),
|
MatchedBy(func(a *ExampleType) bool { return a != nil && a.ran == false }),
|
||||||
).Return(errors.New("error"))
|
).Return(errors.New("error"))
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethod3",
|
||||||
|
MatchedBy(func(a *ExampleType) bool { return a == nil }),
|
||||||
|
).Return(errors.New("error2"))
|
||||||
|
|
||||||
assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil)
|
assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil)
|
||||||
assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error")
|
assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error")
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethod3(nil), "error2")
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
|
func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
|
||||||
@ -198,17 +223,62 @@ func Test_Mock_On_WithFuncArgMatcher(t *testing.T) {
|
|||||||
fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2")
|
fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2")
|
||||||
|
|
||||||
mockedService.On("TheExampleMethodFunc",
|
mockedService.On("TheExampleMethodFunc",
|
||||||
MatchedBy(func(a func(string) error) bool { return a("string") == fixture1 }),
|
MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture1 }),
|
||||||
).Return(errors.New("fixture1"))
|
).Return(errors.New("fixture1"))
|
||||||
|
|
||||||
mockedService.On("TheExampleMethodFunc",
|
mockedService.On("TheExampleMethodFunc",
|
||||||
MatchedBy(func(a func(string) error) bool { return a("string") == fixture2 }),
|
MatchedBy(func(a func(string) error) bool { return a != nil && a("string") == fixture2 }),
|
||||||
).Return(errors.New("fixture2"))
|
).Return(errors.New("fixture2"))
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethodFunc",
|
||||||
|
MatchedBy(func(a func(string) error) bool { return a == nil }),
|
||||||
|
).Return(errors.New("fixture3"))
|
||||||
|
|
||||||
assert.EqualError(t, mockedService.TheExampleMethodFunc(
|
assert.EqualError(t, mockedService.TheExampleMethodFunc(
|
||||||
func(string) error { return fixture1 }), "fixture1")
|
func(string) error { return fixture1 }), "fixture1")
|
||||||
assert.EqualError(t, mockedService.TheExampleMethodFunc(
|
assert.EqualError(t, mockedService.TheExampleMethodFunc(
|
||||||
func(string) error { return fixture2 }), "fixture2")
|
func(string) error { return fixture2 }), "fixture2")
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethodFunc(nil), "fixture3")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_Mock_On_WithInterfaceArgMatcher(t *testing.T) {
|
||||||
|
var mockedService TestExampleImplementation
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethod4",
|
||||||
|
MatchedBy(func(a ExampleInterface) bool { return a == nil }),
|
||||||
|
).Return(errors.New("fixture1"))
|
||||||
|
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethod4(nil), "fixture1")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_Mock_On_WithChannelArgMatcher(t *testing.T) {
|
||||||
|
var mockedService TestExampleImplementation
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethod5",
|
||||||
|
MatchedBy(func(ch chan struct{}) bool { return ch == nil }),
|
||||||
|
).Return(errors.New("fixture1"))
|
||||||
|
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethod5(nil), "fixture1")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_Mock_On_WithMapArgMatcher(t *testing.T) {
|
||||||
|
var mockedService TestExampleImplementation
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethod6",
|
||||||
|
MatchedBy(func(m map[string]bool) bool { return m == nil }),
|
||||||
|
).Return(errors.New("fixture1"))
|
||||||
|
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethod6(nil), "fixture1")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_Mock_On_WithSliceArgMatcher(t *testing.T) {
|
||||||
|
var mockedService TestExampleImplementation
|
||||||
|
|
||||||
|
mockedService.On("TheExampleMethod7",
|
||||||
|
MatchedBy(func(slice []bool) bool { return slice == nil }),
|
||||||
|
).Return(errors.New("fixture1"))
|
||||||
|
|
||||||
|
assert.EqualError(t, mockedService.TheExampleMethod7(nil), "fixture1")
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_Mock_On_WithVariadicFunc(t *testing.T) {
|
func Test_Mock_On_WithVariadicFunc(t *testing.T) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user