在Go 中,模擬在具體類型上宣告的函數,例如func F() {}而func (T) M() {} 是不可能的。然而,還有其他方法可以實現類似的功能。
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) } // 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) { // ... }
任何依賴 ProductRepository 的程式碼現在都可以在正常場景中使用 ProductStore,並在測試期間使用 ProductRepositoryMock。
另一個允許保留現有函數宣告的模擬選項是定義一個模仿 *sql.DB 方法的介面並使用它 反而。例如:
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) { ... }
透過這個方法,GetProductByName 的 DB 參數變得可模擬。
以上是如何有效模擬 Go 中的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!