Tampalan Monyet Golang untuk Kod Tidak Boleh Diubahsuai
Dalam Go, ketiadaan pengubahsuaian objek masa jalan menimbulkan cabaran untuk menguji kod yang saling berkaitan yang tidak mempunyai pergantungan suntikan atau pengaturcaraan antara muka. Untuk mengatasi pengehadan ini, pertimbangkan untuk menggunakan pendekatan berikut:
Mencipta Antara Muka Pembalut Mengejek
Tentukan antara muka anda sendiri yang membungkus struktur asal. Contohnya:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
Menggunakan Struktur Penyesuai
Laksanakan antara muka pembalut dalam struct baharu yang menyesuaikan pelaksanaan struct asal:
type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
Menguji dengan Pembungkus
Anda kini boleh mengejek struct Konkrit dalam ujian unit kerana ia mematuhi antara muka:
// Mock Concrete mock := &MockMyInterface{} c := Concrete{mock} // Call mock method err := c.DoSomething(10)
Membenamkan Jenis Asal
Seperti yang dicadangkan oleh @elithrar, anda juga boleh benamkan jenis asal untuk mengejek secara selektif kaedah yang diperlukan sahaja:
type Concrete struct { *somepackage.Client }
Dalam kes ini, anda masih boleh akses pelaksanaan asal kaedah yang tidak memerlukan ejekan:
c := Concrete{&somepackage.Client{}} c.DoSomethingNotNeedingMocking() // Calls the original implementation
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengejek Kod Go yang Tidak Boleh diubah suai untuk Ujian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!