In Go Verspotten einer Funktion, die für einen konkreten Typ deklariert ist, wie func F() {} und func (T) M() {}, ist nicht möglich. Es gibt jedoch auch andere Ansätze, um eine ähnliche Funktionalität zu erreichen.
Go ermöglicht das Verspotten von Funktionswerten, unabhängig davon, ob sie in Variablen, als Felder in einer Struktur oder als gespeichert sind Parameter, die an andere Funktionen übergeben werden. Betrachten Sie zum Beispiel Folgendes:
var Fn = func() { ... } type S struct { Fn func() } func F(Fn func())
In allen drei Fällen ist Fn verspottbar.
Ein bevorzugterer Ansatz zum Verspotten in Go ist die Verwendung Schnittstellen. Zum Beispiel:
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) { // ... }
Jeder Code, der auf ProductRepository basiert, kann jetzt ProductStore in normalen Szenarien und ProductRepositoryMock während des Tests verwenden.
Andere Eine Möglichkeit zum Verspotten, die es ermöglicht, Ihre vorhandenen Funktionsdeklarationen beizubehalten, besteht darin, eine Schnittstelle zu definieren, die die Methoden von *sql.DB nachahmt, und diese zu verwenden stattdessen. Zum Beispiel:
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) { ... }
Mit diesem Ansatz wird der DB-Parameter für GetProductByName verspottbar.
Das obige ist der detaillierte Inhalt vonWie kann ich Funktionen in Go effektiv verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!