我是Amit Shekhar,一位导师,帮助开发人员获得高薪技术工作。
在此博客中,我们将学习有关在GO(Golang)项目中使用作证和嘲弄的单位测试。
本文最初发表在amitshekhar.me。
在测试任何GO文件时,这两个软件包非常有用。
- 作证:一种具有常见断言和模拟与标准库效果很好的工具包。
- 嘲弄:用于测试的golang的模拟代码自动基因器。
我们知道,作证包用于断言的目的。
嘲弄软件包提供了使用Tistify软件包轻松生成Golang接口的模拟的能力。它删除了使用模拟所需的样板编码。
所以,让我们开始学习使用两个软件包在GO中编写测试。
我将使用以下项目用于实施部分。该项目以GO语言进行了干净的体系结构。您可以使用项目本身中博客中提到的作证和嘲弄的完整代码进行单元测试。
链接到项目:Go Backend Clean Architecture。
在项目中,我们有控制器,用户酶和存储库。在此博客中,我们将学习以用用例为例来编写测试。
考虑给定项目中存在的TaskUsecase
。
package usecase
import (
"context"
"time"
"github.com/amitshekhariitbhu/go-backend-clean-architecture/domain"
)
type taskUsecase struct {
taskRepository domain.TaskRepository
contextTimeout time.Duration
}
func NewTaskUsecase(taskRepository domain.TaskRepository, timeout time.Duration) domain.TaskUsecase {
return &taskUsecase{
taskRepository: taskRepository,
contextTimeout: timeout,
}
}
func (tu *taskUsecase) Create(c context.Context, task *domain.Task) error {
ctx, cancel := context.WithTimeout(c, tu.contextTimeout)
defer cancel()
return tu.taskRepository.Create(ctx, task)
}
func (tu *taskUsecase) FetchByUserID(c context.Context, userID string) ([]domain.Task, error) {
ctx, cancel := context.WithTimeout(c, tu.contextTimeout)
defer cancel()
return tu.taskRepository.FetchByUserID(ctx, userID)
}
因此,我们的目的是测试取决于存储库的用途酶。我们将不得不模拟存储库。
当嘲弄生成Golang界面的模拟时,假设我们具有以下界面的TaskRepository
。
type TaskRepository interface {
Create(c context.Context, task *Task) error
FetchByUserID(c context.Context, userID string) ([]Task, error)
}
作为下一步,我们需要运行以下命令以生成此存储库的模拟。
mockery --dir=domain --output=domain/mocks --outpkg=mocks --all
注意:您将必须根据项目结构和目录修改命令。
它应该生成我们将用于测试的TaskRepository
模拟。
现在,存储库的模拟也已经准备就绪,我们可以为USECase编写测试。
我们将编写USECase中存在的FetchByUserID
方法的测试。
在这里,我们正在测试两种情况:
- 成功:存储库成功返回数据而没有任何错误。
- 错误:存储库返回错误。
以下是代码显示如何使用作证和嘲笑编写这些测试的代码:
package usecase_test
import (
"context"
"errors"
"testing"
"time"
"github.com/amitshekhariitbhu/go-backend-clean-architecture/domain"
"github.com/amitshekhariitbhu/go-backend-clean-architecture/domain/mocks"
"github.com/amitshekhariitbhu/go-backend-clean-architecture/usecase"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"go.mongodb.org/mongo-driver/bson/primitive"
)
func TestFetchByUserID(t *testing.T) {
mockTaskRepository := new(mocks.TaskRepository)
userObjectID := primitive.NewObjectID()
userID := userObjectID.Hex()
t.Run("success", func(t *testing.T) {
mockTask := domain.Task{
ID: primitive.NewObjectID(),
Title: "Test Title",
UserID: userObjectID,
}
mockListTask := make([]domain.Task, 0)
mockListTask = append(mockListTask, mockTask)
mockTaskRepository.On("FetchByUserID", mock.Anything, userID).Return(mockListTask, nil).Once()
u := usecase.NewTaskUsecase(mockTaskRepository, time.Second*2)
list, err := u.FetchByUserID(context.Background(), userID)
assert.NoError(t, err)
assert.NotNil(t, list)
assert.Len(t, list, len(mockListTask))
mockTaskRepository.AssertExpectations(t)
})
t.Run("error", func(t *testing.T) {
mockTaskRepository.On("FetchByUserID", mock.Anything, userID).Return(nil, errors.New("Unexpected")).Once()
u := usecase.NewTaskUsecase(mockTaskRepository, time.Second*2)
list, err := u.FetchByUserID(context.Background(), userID)
assert.Error(t, err)
assert.Nil(t, list)
mockTaskRepository.AssertExpectations(t)
})
}
案例1:成功
在这种情况下,我们模拟了存储库的方法以返回数据。
。然后,我们将模拟的存储库传递到了用户时期。
之后,我们调用了用户酶的方法。
然后最后,断言一切是否按预期进行。
案例2:错误
在这种情况下,我们模拟了存储库的方法以返回错误。
然后,我们将模拟的存储库传递到了用户时期。
之后,我们调用了用户酶的方法。
然后最后,断言一切是否按预期进行。
现在,我们的测试已经准备好进行。我们可以运行测试并检查。
我们可以使用以下命令运行所有测试:
go test ./...
这是我们可以使用GO(Golang)项目中的作证和嘲弄软件包编写单元测试的方式。
我强烈建议您通过该项目并检查为控制器,用户酶和存储库编写的测试。
链接到项目:Go Backend Clean Architecture。
现在就是这样。
谢谢
您可以与我联系: