Rumah > pembangunan bahagian belakang > Golang > Simulasi Golang memaksa perubahan pada definisi fungsi

Simulasi Golang memaksa perubahan pada definisi fungsi

WBOY
Lepaskan: 2024-02-12 12:33:08
ke hadapan
1248 orang telah melayarinya

Simulasi Golang memaksa perubahan pada definisi fungsi

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!

Kandungan soalan

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

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

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")
Salin selepas log masuk

Adakah ini satu-satunya cara untuk menguji secara berterusan? Tidakkah ada cara untuk mengejek api yang tidak disuntik ke dalam fungsi?

Penyelesaian

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

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
Salin selepas log masuk

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

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!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan