Maison >développement back-end >Golang >Comment puis-je simuler des fonctions dans Go pour des tests efficaces ?
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é :
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.
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.
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!