Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengejek Kod Go yang Tidak Boleh diubah suai untuk Ujian?

Bagaimanakah Saya Boleh Mengejek Kod Go yang Tidak Boleh diubah suai untuk Ujian?

DDD
DDDasal
2024-12-09 17:31:17444semak imbas

How Can I Mock Unmodifiable Go Code for Testing?

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!

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