In Go ist das Verspotten bestimmter Funktionen, die in konkreten Typen deklariert werden, nicht möglich. Allerdings stehen Ihnen mehrere Möglichkeiten zur Verfügung, um Testbarkeit zu erreichen:
Funktionswerte, die als Variablen, Strukturfelder oder Funktionsparameter vorliegen, können in Go verspottet werden. Bedenken Sie Folgendes:
var Fn = func() { ... } type S struct { Fn func() } func F(Fn func())
In jedem dieser Fälle ist Fn verspottbar.
Schnittstellen stellen ein effektives und bevorzugtes Mittel zum Verspotten in Go dar. Betrachten Sie das folgende Beispiel:
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) { // ... }
Code, der auf ProductRepository angewiesen ist, kann ProductStore für die normale Ausführung und ProductRepositoryMock für Testzwecke verwenden.
Um die meisten davon beizubehalten Um die ursprüngliche Struktur Ihrer Funktion zu erhalten und gleichzeitig Mocking zu aktivieren, erstellen Sie eine Schnittstelle, die die Methoden des Typs widerspiegelt, der an Ihre Funktionen übergeben werden soll. Implementieren Sie dann eine Scheinversion der Schnittstelle und verwenden Sie sie beim Testen.
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) { ... }
Der DB-Parameter in GetProductByName ist jetzt verspottbar.
Das obige ist der detaillierte Inhalt vonWie kann ich Funktionen in Go simulieren, um effektive Tests zu ermöglichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!