Rumah >pembangunan bahagian belakang >Golang >Golang: Memintas dan mensimulasikan respons HTTP menggunakan httptest
Editor PHP Zimo membawakan anda artikel tentang menggunakan httptest untuk memintas dan mensimulasikan respons HTTP di Golang. Dalam artikel ini, kami akan mendalami cara menggunakan pakej httptest untuk memintas permintaan HTTP dan mensimulasikan respons untuk ujian unit dan ujian berfungsi. Dengan menggunakan httptest, kami boleh mensimulasikan respons HTTP dengan mudah dalam pelbagai senario untuk menguji ketepatan dan keteguhan kod kami. Menguasai teknik ini sangat berguna untuk pemula dan pembangun berpengalaman. Seterusnya, mari belajar tentang kaedah pelaksanaan khusus!
Saya telah melihat pelbagai alatan berbeza yang tersedia untuk ujian olok-olok dalam golang, tetapi saya cuba menggunakan httptest untuk menyelesaikan tugasan ini. Khususnya, saya mempunyai fungsi seperti ini:
type contact struct { username string number int } func getResponse(c contact) string { url := fmt.Sprintf("https://mywebsite/%s", c.username) req, err := http.NewRequest(http.MethodGet, url, nil) // error checking resp, err := http.DefaultClient.Do(req) // error checking return response }
Banyak dokumentasi yang saya baca nampaknya memerlukan penciptaan antara muka pelanggan atau pengangkutan tersuai. Adakah terdapat cara untuk mensimulasikan respons dalam fail ujian tanpa mengubah kod utama ini? Saya ingin menyimpan pelanggan saya, respons dan semua butiran berkaitan dalam panggilan getresponse
函数中。我可能有错误的想法,但我正在尝试找到一种方法来拦截 http.defaultclient.do(req)
dan mengembalikan respons tersuai, adakah ini mungkin?
Saya membaca bahawa nampaknya anda perlu mencipta antara muka pelanggan
Jangan tukar kod utama ini sama sekali
Memastikan kod anda bersih ialah amalan yang baik, akhirnya anda akan terbiasa dengannya, kod yang boleh diuji adalah lebih bersih dan kod yang lebih bersih lebih boleh diuji, jadi jangan risau tentang menukar kod anda (menggunakan antara muka) supaya ia boleh menerima objek olok-olok .
Bentuk kod yang paling ringkas boleh jadi seperti ini:
package main import ( "fmt" "net/http" ) type contact struct { username string number int } type client interface { do(req *http.request) (*http.response, error) } func main() { getresponse(http.defaultclient, contact{}) } func getresponse(client client, c contact) string { url := fmt.sprintf("https://mywebsite/%s", c.username) req, _ := http.newrequest(http.methodget, url, nil) // error checking resp, _ := http.defaultclient.do(req) // error checking and response processing return response }
package main import ( "net/http" "testing" ) type mockclient struct { } // do function will cause mockclient to implement the client interface func (tc mockclient) do(req *http.request) (*http.response, error) { return &http.response{}, nil } func testgetresponse(t *testing.t) { client := new(mockclient) getresponse(client, contact{}) }
package main import ( "fmt" "io" "net/http" "net/http/httptest" ) type contact struct { username string number int } func main() { fmt.Println(getResponse(contact{})) } func getResponse(c contact) string { // Make a test server ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "your response") })) defer ts.Close() // You should still set your base url base_url := ts.URL url := fmt.Sprintf("%s/%s", base_url, c.username) req, _ := http.NewRequest(http.MethodGet, url, nil) // Use ts.Client() instead of http.DefaultClient in your tests. resp, _ := ts.Client().Do(req) // Processing the response response, _ := io.ReadAll(resp.Body) resp.Body.Close() return string(response) }
Atas ialah kandungan terperinci Golang: Memintas dan mensimulasikan respons HTTP menggunakan httptest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!