BigLOL
BigLOL

Reputation: 311

testify using real function result as mocked function argument

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

Answers (1)

kozmo
kozmo

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

PLAYGROUND

Upvotes: 1

Related Questions