Editor PHP Xiaoxin hari ini membawakan anda pengenalan kepada simulasi Golang yang mengubah definisi fungsi secara paksa. Golang ialah bahasa pengaturcaraan yang cekap dan ringkas dengan sistem jenis yang berkuasa. Walau bagaimanapun, dalam beberapa kes, kita mungkin perlu mengubah suai definisi fungsi sedia ada untuk memenuhi keperluan khusus. Artikel ini akan memperkenalkan kepada anda cara mensimulasikan kaedah menukar definisi fungsi secara paksa dalam Golang Mari kita terokai bersama-sama!
Saya mempunyai fungsi berikut:
func getprice(date string) { url := (fmt.printf("http://endponint/%s", date)) resp, err := http.get(url) // unmarshall body and get price return price }
Untuk menguji unit fungsi ini, saya terpaksa memfaktorkan semula kepada:
func getprice(client httpclient, date string) { url := (fmt.printf("http://endponint/%s", date)) resp, err := client.get(url) // unmarshall body and get price return price }
Ujian saya kelihatan seperti ini:
type MockClient struct { Response *http.Response Err error } func (m *MockClient) Get(url string) (*http.Response, error) { return m.Response, m.Err } mockResp := &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(strings.NewReader("mock response")), } client := &MockClient{ Response: mockResp, Err: nil, } data, err := getData(client, "http://example.com")
Adakah ini satu-satunya cara untuk menguji secara berterusan? Tidakkah ada cara untuk mengejek api yang tidak disuntik ke dalam fungsi?
Cara idiomatik untuk melakukan ujian http dengan go ialah menggunakan http/httptest ( Contoh)
Dalam kes anda, semua yang anda perlu lakukan ialah menjadikan url asas boleh disuntik:
var apiendpoint = "http://endpoint/" func getprice(date string) (int, error) { url := (fmt.printf("%s/%s", apiendpoint, date)) resp, err := http.get(url) // unmarshall body and get price return price, nil }
Kemudian dalam setiap ujian:
srv := httptest.newserver(http.handlerfunc(func(w http.responsewriter, r *http.request) { // write the expected response to the writer })) defer srv.close() apiendpoint = srv.url price, err := getprice("1/1/2023") // handle error, check return
Reka bentuk yang lebih baik ialah membungkus api anda di sisi pelanggan struct
中,并使 getprice
Jadilah kaedah penerima:
type priceclient struct { endpoint string } func (pc *priceclient) getprice(date string) (int, error) { url := (fmt.printf("%s/%s", pc.endpoint, date)) resp, err := http.get(url) // unmarshall body and get price return price, nil }
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Write the expected response to the writer })) defer srv.Close() c := &PriceClient{Endpoint: srv.URL} price, err := c.GetPrice("1/1/2023") // Handle error, check return
Untuk rujukan masa hadapan, anda juga harus melihat gomock, kerana kebanyakan masalah mengejek lain yang anda akan hadapi tidak mempunyai penyelesaian terbina dalam dalam bahasa tersebut.
Atas ialah kandungan terperinci Simulasi Golang memaksa perubahan pada definisi fungsi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!