如何使用 Golang 创建单元测试依赖注入

问题描述 投票:0回答:1

比如我想创建一个用户API 具有这样的依赖注入结构

func Bootstrap(config *BootstrapConfig) {
// setup repositories
userRepository := repository.NewUserRepository(config.Log)
// setup producer
userProducer := messaging.NewUserProducer(config.Producer, config.Log)
// setup use cases
userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
// setup controller
userController := http.NewUserController(userUseCase, config.Log)
routeConfig := route.RouteConfig{
    App:               config.App,
    UserController:    userController,
}
routeConfig.Setup()
}

然后,我想为用户创建 API 创建一个单元测试,但我不想与数据库进行真正的交互或模拟。由于 userUseCase 需要一个存储库,这意味着我们将为 SaveUserToDB 函数创建一个模拟 userRepository。

这样的方法使用正确吗?

mockRepo.On("SaveUserToDB", mock.Anything, mock.AnythingOfType("*repository.User")).Return(nil)
unit-testing go dependency-injection frameworks
1个回答
0
投票

依赖注入需要实际注入依赖项。

Bootstrap
正在创建其依赖项,因此可以说这不是依赖项注入。如果你在测试中使用
Bootstrap
,那么这绝对不是依赖注入。

所以你需要将

func Bootstrap(config *BootstrapConfig)
至少更改为
func Bootstrap(config *BootstrapConfig, userRepository *repository.User)

然后,在您的测试中,您将通过

mockRepo
Bootstrap

func Bootstrap(config *BootstrapConfig, userRepository *repository.User) {
    // setup producer
    userProducer := messaging.NewUserProducer(config.Producer, config.Log)
    // setup use cases
    userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
    // setup controller
    userController := http.NewUserController(userUseCase, config.Log)
    routeConfig := route.RouteConfig{
        App:               config.App,
        UserController:    userController,
    }
    routeConfig.Setup()
}

func TestFoo(t *testing.T) {
    mockRepo := mocks.NewUserRepository(config.Log)
    Bootstrap(config, mockRepo)
    mockRepo.On("SaveUserToDB", mock.Anything).Return(nil)
    …
}

Bootstrap
不应创建任何依赖项,因此您应该将其应用于
userProducer
userUseCase

© www.soinside.com 2019 - 2024. All rights reserved.