Maison  >  Article  >  développement back-end  >  Comment créer des tests unitaires avec injection de dépendances à l'aide de Golang

Comment créer des tests unitaires avec injection de dépendances à l'aide de Golang

PHPz
PHPzavant
2024-02-11 15:42:08403parcourir

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

l'éditeur php Youzi vous propose un article sur la façon d'utiliser Golang pour créer une injection de dépendances de tests unitaires. Dans le développement de logiciels, les tests unitaires sont un élément crucial et l'injection de dépendances est un modèle de conception couramment utilisé qui peut nous aider à mieux effectuer les tests unitaires. Cet article présentera brièvement comment utiliser Golang pour implémenter l'injection de dépendances afin que nous puissions écrire du code testable plus facilement. Explorons ensemble !

Contenu de la question

Par exemple, je souhaite créer une API utilisateur Avec une structure d'injection de dépendances comme celle-ci

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

Ensuite, je souhaite créer un test unitaire pour l'API de création d'utilisateurs, mais je ne veux pas réellement interagir ou simuler avec la base de données. Étant donné que userUseCase nécessite un référentiel, cela signifie que nous allons créer un userRepository fictif pour la fonction SaveUserToDB.

Est-ce la bonne méthode à utiliser ?

mockRepo.On("SaveUserToDB", mock.Anything, mock.AnythingOfType("*repository.User")).Return(nil)

Solution de contournement

L'injection de dépendances nécessite d'injecter réellement les dépendances. Bootstrap 正在创建其依赖项,因此可以说这不是依赖项注入。如果你在测试中使用了 Bootstrap , alors ce n'est certainement pas une injection de dépendance.

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

Ensuite, lors de votre test, vous le ferez 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 不应创建任何依赖项,因此您应该将其应用于 userProduceruserUseCaseAttends

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer