Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-11 15:42:08
avant
367 Les gens l'ont consulté

如何使用 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()
}
Copier après la connexion

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)
Copier après la connexion

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)
    …
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!