Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengejek Fungsi dalam Go untuk Ujian Berkesan?
Dalam Go, mengejek fungsi khusus yang diisytiharkan dalam jenis konkrit tidak boleh dilaksanakan. Walau bagaimanapun, anda mempunyai beberapa pilihan yang anda boleh gunakan untuk mencapai kebolehujian:
Nilai fungsi, hadir sebagai pembolehubah, medan struct atau parameter fungsi, boleh dipermainkan dalam Go. Pertimbangkan perkara berikut:
var Fn = func() { ... } type S struct { Fn func() } func F(Fn func())
Dalam setiap kes ini, Fn boleh diejek.
Antaramuka menyediakan cara mengejek yang berkesan dan diutamakan dalam Go. Pertimbangkan contoh berikut:
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) { // ... }
Kod yang bergantung pada ProductRepository boleh menggunakan ProductStore untuk pelaksanaan biasa dan ProductRepositoryMock untuk tujuan ujian.
Untuk mengekalkan kebanyakan struktur asal fungsi anda sambil membolehkan mengejek, buat antara muka yang mencerminkan kaedah taip untuk dihantar ke fungsi anda. Kemudian, laksanakan kedua-dua versi tiruan antara muka dan gunakannya semasa ujian.
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) { ... }
Parameter DB dalam GetProductByName kini boleh diejek.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengejek Fungsi dalam Go untuk Ujian Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!