首頁 >後端開發 >Golang >如何模擬 Go 中的函數以進行有效的測試?

如何模擬 Go 中的函數以進行有效的測試?

Susan Sarandon
Susan Sarandon原創
2024-12-05 09:15:14639瀏覽

How Can I Mock Functions in Go for Effective Testing?

如何在 Go 中製作可模擬函數

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn