mockery
mockery copied to clipboard
[QUESTION] How can I assert runtime arguments of method
When using mock, I always need specify method arguments with On() & Return(). But if I just want to test the running argument (using assert). How can I do that
Structs
type args struct {
ctx context.Context
t *asynq.Task
}
type mockArgs struct {
mck interface{} // mock
name string
params []interface{}
res []interface{}
verifyParams []interface{}
}
type assertMockFn struct {
callFn *mock.Call
verifyParams []interface{}
assertFn func(mock.TestingT) bool
}
Testing
for _, tt := range tests {
var assertMockFnList = make([]*assertMockFn, 0, len(tt.mockFnList))
for _, mockFn := range tt.mockFnList {
onMethod := reflect.ValueOf(mockFn.mck).MethodByName("On").Interface().(func(string, ...interface{}) *mock.Call)
callFn := onMethod(mockFn.name, mockFn.params...).Return(mockFn.res...)
assertExpectationsMethod := reflect.ValueOf(mockFn.mck).MethodByName("AssertExpectations").Interface().(func(mock.TestingT) bool)
assertMockFnList = append(assertMockFnList, &assertMockFn{
callFn: callFn,
verifyParams: mockFn.verifyParams,
assertFn: assertExpectationsMethod,
})
}
err := svc.DoSomething(tt.args.ctx, tt.args.t)
if tt.wantErr {
s.Errorf(err, "error = %v, wantErr %v", err, tt.wantErr)
} else {
s.Nilf(err, "error = %v, wantErr %v", err, tt.wantErr)
}
for _, assertMockFn := range assertMockFnList {
assertMockFn.assertFn(s.T())
if len(assertMockFn.verifyParams) > 0 {
actualParams := assertMockFn.callFn.Arguments
for idx, param := range assertMockFn.verifyParams {
expected, err := json.Marshal(param)
s.Nil(err)
actual, err := json.Marshal(actualParams.Get(idx))
s.Nil(err)
s.JSONEq(string(expected), string(actual))
}
}
}
for _, assertMockFn := range assertMockFnList {
assertMockFn.callFn.Unset()
}
}