登录
首页 >  Golang >  Go问答

证明使用真实函数值作为模拟函数参数

来源:stackoverflow

时间:2024-02-24 09:18:24 176浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《证明使用真实函数值作为模拟函数参数》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

如何测试这个功能

我需要确保模拟的 findbyid 函数返回值是具有创建的 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
}

当前测试功能

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

解决方案


选项之一是针对此特定情况手动创建 mock(如果已生成)。

例如(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

好了,本文到此结束,带大家了解了《证明使用真实函数值作为模拟函数参数》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>