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

Comment puis-je simuler efficacement des fonctions dans Go ?

Linda Hamilton
Libérer: 2024-12-06 21:23:14
original
447 Les gens l'ont consulté

How Can I Effectively Mock Functions in Go?

Fonctions moqueuses dans Golang

Introduction

Dans Go, se moquer d'une fonction déclarée sur un type concret, comme func F() {} et func (T) M() {}, n'est pas possible. Cependant, il existe d'autres approches pour obtenir des fonctionnalités similaires.

Valeurs de fonction moqueuses

Go permet de moquer les valeurs de fonction, qu'elles soient stockées dans des variables, en tant que champs sur une structure ou en tant que paramètres passés à d’autres fonctions. Par exemple, considérons ce qui suit :

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
Copier après la connexion

Dans les trois cas, Fn est moqueur.

Interfaces moqueuses

Une approche plus préférée pour se moquer dans Go consiste à utiliser interfaces. Par exemple :

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

// The real implementer
type ProductStore struct{}

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

// The mock implementer
type ProductRepositoryMock struct{}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}
Copier après la connexion

Tout code qui s'appuie sur ProductRepository peut désormais utiliser ProductStore dans des scénarios normaux et ProductRepositoryMock pendant les tests.

Interfaces moqueuses pour *sql.DB

Un autre L'option de simulation qui permet de préserver vos déclarations de fonctions existantes consiste à définir une interface qui imite les méthodes de *sql.DB et à l'utiliser à la place. Par exemple :

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // Only declare methods that are actually used.
}

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

Avec cette approche, le paramètre DB de GetProductByName devient 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