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.
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.
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.
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!