support ctx as input params, error as output for MockClient.Call

This commit is contained in:
gemantic 2019-12-14 10:23:55 +08:00
parent 631faff7b8
commit 5602b93d7a
2 changed files with 26 additions and 3 deletions

View File

@ -84,10 +84,24 @@ func (m *MockClient) Call(ctx context.Context, req client.Request, rsp interface
response := r.Response response := r.Response
if t := reflect.TypeOf(r.Response); t.Kind() == reflect.Func { if t := reflect.TypeOf(r.Response); t.Kind() == reflect.Func {
var request []reflect.Value var request []reflect.Value
if t.NumIn() == 1 { switch t.NumIn() {
case 1:
// one input params: (req)
request = append(request, reflect.ValueOf(req.Body())) request = append(request, reflect.ValueOf(req.Body()))
case 2:
// two input params: (ctx, req)
request = append(request, reflect.ValueOf(ctx), reflect.ValueOf(req.Body()))
}
responseValue := reflect.ValueOf(r.Response).Call(request)
response = responseValue[0].Interface()
if len(responseValue) == 2 {
// make it possible to return error in response function
respErr, ok := responseValue[1].Interface().(error)
if ok && respErr != nil {
return respErr
}
} }
response = reflect.ValueOf(r.Response).Call(request)[0].Interface()
} }
v.Set(reflect.ValueOf(response)) v.Set(reflect.ValueOf(response))

View File

@ -2,6 +2,7 @@ package mock
import ( import (
"context" "context"
"fmt"
"testing" "testing"
"github.com/micro/go-micro/errors" "github.com/micro/go-micro/errors"
@ -24,6 +25,12 @@ func TestClient(t *testing.T) {
} }
return "wrong" return "wrong"
}}, }},
{Endpoint: "Foo.FuncWithRequestContextAndResponse", Response: func(ctx context.Context, req interface{}) string {
return "something"
}},
{Endpoint: "Foo.FuncWithRequestContextAndResponseError", Response: func(ctx context.Context, req interface{}) (string, error) {
return "something", fmt.Errorf("mock error")
}},
} }
c := NewClient(Response("go.mock", response)) c := NewClient(Response("go.mock", response))
@ -35,7 +42,9 @@ func TestClient(t *testing.T) {
err := c.Call(context.TODO(), req, &rsp) err := c.Call(context.TODO(), req, &rsp)
if err != r.Error { if err != r.Error {
t.Fatalf("Expecter error %v got %v", r.Error, err) if r.Endpoint != "Foo.FuncWithRequestContextAndResponseError" {
t.Fatalf("Expecter error %v got %v", r.Error, err)
}
} }
t.Log(rsp) t.Log(rsp)