在 Go 中,模擬在具體類型中聲明的特定函數是不可行的。但是,您可以使用多種選項來實現可測試性:
可以在 Go 中模擬作為變數、結構體欄位或函數參數出現的函數值。請考慮以下內容:
var Fn = func() { ... } type S struct { Fn func() } func F(Fn func())
在每種情況下,Fn 都是可模擬的。
介面提供了 Go 中有效且首選的模擬方法。考慮以下範例:
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) { // ... }
依賴 ProductRepository 的程式碼可以利用 ProductStore 進行正常執行,並利用 ProductRepositoryMock 進行測試。
保留大部分在啟用模擬的同時,保留函數的原始結構,建立一個鏡像要傳遞給函數的類型的方法的介面。然後,實作介面的模擬版本並在測試期間使用它。
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) { ... }
GetProductByName 中的 DB 參數現在是可模擬的。
以上是如何模擬 Go 中的函數以進行有效的測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!