Maison  >  Article  >  développement back-end  >  Injection de dépendances dans les tests de fonction Golang

Injection de dépendances dans les tests de fonction Golang

WBOY
WBOYoriginal
2024-04-12 16:33:01763parcourir

L'injection de dépendances peut être implémentée dans Go via des bibliothèques tierces. Il est recommandé d'utiliser la bibliothèque wire. Le mode d'injection de dépendances permet l'injection dynamique de dépendances, le découplage du code de test et du code de production et l'amélioration de la maintenabilité et de l'évolutivité des tests. Wire fournit un injecteur de dépendances qui peut injecter des dépendances fictives. Par exemple, dans l'exemple, la méthode GetCustomer de CustomerService est testée en injectant un CustomerRepository fictif, améliorant ainsi la qualité des tests.

Golang 函数测试中的依赖注入

Injection de dépendances pour les tests de fonctions dans Go

Introduction

Dans les tests unitaires, il est souvent nécessaire de fournir des dépendances pour la fonction testée. L'approche traditionnelle consiste à transmettre les dépendances directement en tant que paramètres dans la fonction testée. Cependant, cette approche couplera étroitement le test au code testé, ce qui rendra difficile sa maintenance et son extension.

Dependency Injection

Dependency Injection est un modèle de conception qui permet d'injecter dynamiquement des dépendances dans le constructeur ou la méthode d'un objet au moment de l'exécution. L'utilisation de l'injection de dépendances peut découpler le code de test et le code de production, améliorant ainsi la maintenabilité et l'évolutivité des tests.

Injection de dépendances dans Go

Il n'y a pas de cadre d'injection de dépendances intégré dans Go, mais cela peut être réalisé à l'aide de bibliothèques tierces. Il est recommandé d'utiliser la bibliothèque [wire](https://github.com/google/wire), qui est une bibliothèque légère d'injection de dépendances développée par Google.

Cas pratique

Supposons que nous ayons un CustomerService, qui dépend d'un CustomerRepository : CustomerService,它依赖于一个 CustomerRepository

type CustomerService struct {
    repo CustomerRepository
}

func (s *CustomerService) GetCustomer(id int) (*Customer, error) {
    return s.repo.Get(id)
}

要测试 GetCustomer 方法,我们需要为它提供一个模拟的 CustomerRepository

使用 wire 实现

使用 wire,我们可以创建一个依赖注入器,如下所示:

func provideCustomerService(repo CustomerRepository) (*CustomerService, error) {
    return &CustomerService{
        repo: repo,
    }, nil
}

然后,在测试中,我们可以使用 wire 来注入模拟的 CustomerRepository

func TestGetCustomer(t *testing.T) {
    repo := &fakeCustomerRepository{} // 模拟的 CustomerRepository

    service, err := provideCustomerService(repo)
    if err != nil {
        t.Fatalf("provideCustomerService: %v", err)
    }

    // 测试 CustomerService 的 GetCustomer 方法
}

Pour tester la méthode GetCustomer, nous Il doit être fourni avec un faux CustomerRepository.

🎜Implémenté en utilisant wire🎜🎜🎜En utilisant wire, nous pouvons créer un injecteur de dépendances comme celui-ci : 🎜rrreee🎜 Ensuite, dans le test, nous pouvons utiliser wire pour injecter le CustomerRepository simulé : 🎜rrreee🎜 En utilisant l'injection de dépendances, nous pouvons fournir des dépendances fictives pour le test sans modifier le code testé, améliorant ainsi la maintenabilité et l'évolutivité du test. 🎜

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:
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