Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengejek Fungsi dalam Go untuk Ujian Berkesan?

Bagaimanakah Saya Boleh Mengejek Fungsi dalam Go untuk Ujian Berkesan?

Susan Sarandon
Susan Sarandonasal
2024-12-05 09:15:14633semak imbas

How Can I Mock Functions in Go for Effective Testing?

Cara Membuat Fungsi Boleh Diejek dalam Go

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 Mengejek

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.

Memanfaatkan Antara Muka

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.

Menyesuaikan Fungsi melalui Antara Muka

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn