Apabila unit menguji fungsi pengendali Gin yang mengikat parameter pertanyaan, alamat memori tidak sah atau nol ralat penyahrujukan penunjuk berlaku disebabkan oleh HTTP yang tidak dimulakan dengan betul permintaan.
Untuk mengejek pengikatan parameter pertanyaan menggunakan c.BindQuery(), mulakan permintaan HTTP dengan URL dan URL.RawQuery yang betul. Gunakan fungsi pembantu berikut:
func mockGin() (*gin.Context, *httptest.ResponseRecorder) { req := &http.Request{ URL: &url.URL{}, Header: make(http.Header), } q := req.URL.Query() // Add query parameters to the request // ... req.URL.RawQuery = q.Encode() c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = req return c, httptest.NewRecorder() }
Untuk menguji panggilan perkhidmatan, jadikan perkhidmatan sebagai antara muka dan masukkannya ke dalam pengendali. Anda boleh menetapkan perkhidmatan sebagai nilai konteks Gin, membolehkan anda mengejeknya dalam ujian unit. Contohnya:
func GetMaterialByFilter(c *gin.Context) { weldprogService := mustGetService(c) // ... Call the service method ... } func mustGetService(c *gin.Context) services.WeldprogService { svc, exists := c.Get("svc_context_key") if !exists { panic("service was not set") } return svc.(services.WeldprogService) }
Dalam ujian unit, tetapkan perkhidmatan olok-olok ke dalam konteks:
c.Set("svc_context_key", &mockSvc{})
di mana mockSvc melaksanakan antara muka perkhidmatan.
Atas ialah kandungan terperinci Bagaimana untuk Menguji Fungsi Pengendali Gin dengan Berkesan dengan Parameter Pertanyaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!