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 中国語 Web サイトの他の関連記事を参照してください。