Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengolok-olok `c.BindQuery` Gin untuk Ujian Unit Berkesan?
Ujian unit untuk fungsi pengendali Gin GetMaterialByFilter gagal apabila c.BindQuery dipanggil . Bagaimanakah isu ini boleh diselesaikan dengan mengejek fungsi?
Isu ini berpunca daripada kekurangan permintaan HTTP sebenar semasa ujian. Untuk melaksanakan operasi berasaskan HTTP, permintaan mesti dimulakan dan ditetapkan kepada konteks Gin. Khususnya, untuk c.BindQuery, permulaan yang betul bagi URL dan URL permintaan.RawQuery adalah penting.
Untuk mengejek c.BindQuery, ikut langkah ini:
func mockGin() (*gin.Context, *httptest.ResponseRecorder) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) req := &http.Request{ URL: &url.URL{}, Header: make(http.Header), } testQuery := weldprogs.QueryParam{/* init fields */} q := req.URL.Query() for _, s := range testQuery.Basematgroup_id { q.Add("basematgroup_id", s) } req.URL.RawQuery = q.Encode() c.Request = req return c, w }
Selain itu, panggilan services.WeldprogService.GetMaterialByFilter(&queryParam) tidak boleh diuji dalam bentuk semasanya. Ia mestilah antara muka dan disuntik sebagai kebergantungan pengendali.
func GetMaterialByFilter(c *gin.Context) { //... weldprogService := mustGetService(c) materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam) // ... } 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) }
type mockSvc struct { } // have 'mockSvc' implement the interface func TestGetMaterialByFilter(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) // now you can set mockSvc into the test context c.Set("svc_context_key", &mockSvc{}) GetMaterialByFilter(c) // ... }
Dengan menggabungkan teknik ini, anda boleh mengejek c.BindQuery dan kebergantungan luaran dengan berkesan, membolehkan ujian unit komprehensif bagi pengendali Gin anda fungsi.
Atas ialah kandungan terperinci Bagaimana untuk Mengolok-olok `c.BindQuery` Gin untuk Ujian Unit Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!