Reputation: 311
How can I test this function
I need to make sure mocked FindByID function return value is a user with created UUID.
func (s *Service) Register(newUser domain.User) (domain.User, error) {
newUser.ID = uuid.New()
s.repo.Create(newUser)
createdUser, err := s.FindByID(newUser.ID)
if err != nil {
return domain.User{}, err
}
return createdUser, nil
}
Currently test function
t.Run("When Register called, it should return createdUser", func(t *testing.T) {
repo := new(mocks.UserRepository)
s := service.NewService(repo)
user := domain.User{Name: "TestName", Email: "TestEmail"}
repo.On("Create", mock.Anything)
// I need to make sure FindByID function return value is a user with created UUID
repo.On("FindByID", mock.Anything).Return(user, nil)
createdUser, err := s.Register(user)
assert.NoError(t, err)
assert.IsType(t, createdUser.ID, uuid.UUID{})
})
Upvotes: 0
Views: 1404
Reputation: 4471
As one of options is creating mock
manually (if it was generated) to this specific case.
For example (testify-mock):
type repoMock struct {
mock.Mock
cache map[uuid.UUID]domain.User
}
func newRepoMock() *repoMock {
cache := make(map[uuid.UUID]domain.User)
return &repoMock{cache: cache}
}
func (m *repoMock) Create(user domain.User) {
m.Called(user)
m.cache[user.ID] = user
}
func (m *repoMock) FindByID(uuid uuid.UUID) (domain.User, error) {
args := m.Called(s)
res := args[0]
if res == nil {
return m.cache[uuid], args.Error(1)
}
return res.(domain.User), args.Error(1)
}
Upvotes: 1