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

Bagaimanakah Saya Boleh Mengejek Fungsi dengan Berkesan dalam Go?

Linda Hamilton
Lepaskan: 2024-12-06 21:23:14
asal
447 orang telah melayarinya

How Can I Effectively Mock Functions in Go?

Fungsi Mengejek di Golang

Pengenalan

Dalam Go, mengejek fungsi yang diisytiharkan pada jenis konkrit, seperti func F() {} dan func (T) M() {}, tidak mungkin. Walau bagaimanapun, terdapat pendekatan lain untuk mencapai kefungsian yang serupa.

Nilai Fungsi Mengejek

Go membenarkan nilai fungsi mengejek, tidak kira sama ada ia disimpan dalam pembolehubah, sebagai medan pada struct, atau sebagai parameter dihantar ke fungsi lain. Sebagai contoh, pertimbangkan perkara berikut:

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
Salin selepas log masuk

Dalam ketiga-tiga kes, Fn boleh dipermainkan.

Antara Muka Mengejek

Pendekatan yang lebih disukai untuk mengejek dalam Go ialah menggunakan antara muka. Contohnya:

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) {
    // ...
}
Salin selepas log masuk

Sebarang kod yang bergantung pada ProductRepository kini boleh menggunakan ProductStore dalam senario biasa dan ProductRepositoryMock semasa ujian.

Antara Muka Mengejek untuk *sql.DB

Satu lagi pilihan untuk mengejek yang membolehkan untuk mengekalkan pengisytiharan fungsi sedia ada anda adalah untuk menentukan antara muka yang meniru kaedah *sql.DB dan gunakannya sebaliknya. Contohnya:

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) {
    ...
}
Salin selepas log masuk

Dengan pendekatan ini, parameter DB untuk GetProductByName menjadi boleh dipermainkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengejek Fungsi dengan Berkesan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan