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
Linda Hamiltonoriginal
2024-12-06 21:23:14487parcourir

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())

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) {
    // ...
}

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) {
    ...
}

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!

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