How to write test case for a function which has aerospike.RecordSet as a return value

Hi All, we are writing test cases for “GetListOfUsers()” function of “UserService.go“ file. We are facing issue in creating dummy aerospike.RecordSet object

func (suite *UserServiceTestSuite) TestGetListOfUsers() {
    suite.mockUserRepository.EXPECT().QueryDataEquality(models.UserSet, "t_id", “test_team”).Return(Dummy_RecordSet_Object, nil)
    // how we can create dummy aerospike.RecordSet object ?
    userList, err := suite.userService.GetListOfUsers(suite.context, “test_team”)
    // suite.Error(err)
}

================ UsersRepository.go ———————

func (a *aerospike) QueryDataEquality(setName, binName, binData string) (*aero.Recordset, error) {
    stm := aero.NewStatement(a.Namespace, setName)
    err := stm.SetFilter(aero.NewEqualFilter(binName, binData))
    if err != nil {
        return nil, err
    }
    recordset, err := a.client.Query(nil, stm)
    if err != nil {
       return nil, err
    }
    return recordset, nil
}

================ UserService.go file ————————

func (us usersService) GetListOfUsers(ctx *gin.Context, teamId string) ([]models.Users, error) {
    var listOfUsers []models.Users
    records, err := us.aeroClient.QueryDataEquality(models.UserSet, "t_id", teamId)
    if err != nil {
        return nil, err
    }
    for res := range records.Results() {
        if res.Err != nil {
           return nil, res.Err
        } else {
            jsonStr, err := json.Marshal(res.Record.Bins)
            if err != nil {
                return nil, err
            }
            var tempUser models.Users
            if err := json.Unmarshal(jsonStr, &tempUser); err != nil {
                continue
            }
	    listOfUsers = append(listOfUsers, tempUser)
        }
    }
    return listOfUsers, nil
}

Seems this is cross posted on Stackoverflow: How to create Unit test cases for “GetListOfUsers()” function of “UserService.go“ file. Facing issue in creating dummy aerospike.Recordset object - Stack Overflow

The easiest way is to mock the Recordset itself. Since interfaces are used for abstractions and they are implicit in Go, you can implement:

type RecordsetIfc interface {
	Results() <-chan *aero.Result
}

// You can then implement a mock here
type MockRecordset struct{}

func (mrs *MockRecordset) Results() <-chan *aero.Result {
	res := make(chan *aero.Result)
	go func() {
		defer res.Close()
		for i := 0; i < 1000; i++ {
			res <- &aero.Result{
				Record: &aero.Record{
					Bins: aero.BinMap{ /*Whatever you need*/ },
				},
			}
		}
	}()

	return res
}

Use the RecordsetIfc as type in your functions, and in tests pass the mock instead of the real one.

1 Like