mockery icon indicating copy to clipboard operation
mockery copied to clipboard

[QUESTION] How can I assert runtime arguments of method

Open hieunguyen1809 opened this issue 2 years ago • 0 comments

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()
		}
	}

hieunguyen1809 avatar Jul 20 '22 10:07 hieunguyen1809