Maison >développement back-end >Golang >Comment puis-je simuler des fonctions dans Go pour des tests efficaces ?

Comment puis-je simuler des fonctions dans Go pour des tests efficaces ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 09:15:14633parcourir

How Can I Mock Functions in Go for Effective Testing?

Comment créer des fonctions simulables dans Go

Dans Go, se moquer de fonctions spécifiques déclarées dans des types concrets n'est pas réalisable. Cependant, vous disposez de plusieurs options pour réaliser la testabilité :

Valeurs de fonction moqueuses

Les valeurs de fonction, présentes sous forme de variables, de champs de structure ou de paramètres de fonction, peuvent être simulées dans Go. Considérez ce qui suit :

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())

Dans chacun de ces cas, Fn est moqueable.

Exploiter les interfaces

Les interfaces fournissent un moyen efficace et privilégié de se moquer dans Go. Prenons l'exemple suivant :

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

// Real implementation
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// Mock implementation
type ProductRepositoryMock struct {}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}

Le code dépendant de ProductRepository peut utiliser ProductStore pour une exécution normale et ProductRepositoryMock à des fins de test.

Adaptation des fonctions via des interfaces

Pour conserver la plupart des la structure originale de votre fonction tout en permettant la simulation, créez une interface qui reflète les méthodes du type à transmettre à vos fonctions. Ensuite, implémentez une version fictive de l'interface et utilisez-la pendant les tests.

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // ...
}

type DBMock struct {}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
   ...
}

Le paramètre DB dans GetProductByName est désormais simulable.

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