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
Libérer: 2024-12-05 09:15:14
original
640 Les gens l'ont consulté

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

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

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

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal