Cara Menguji Unit Fungsi Pengendali Go Gin dengan Pengikatan Data Permintaan
Dalam ujian unit fungsi pengendali Gin, memulakan dan menetapkan permintaan dengan betul badan dan parameter pertanyaan adalah penting. Mari kita mendalami cara menguji c.BindQuery dengan berkesan.
Dalam kod ujian yang disediakan, c.BindQuery tidak berfungsi kerana permintaan HTTP tidak dimulakan dengan sebarang parameter pertanyaan. Untuk mengejek c.BindQuery, anda perlu membuat permintaan ujian dan menetapkan URL dan URL.RawQuerynya dengan sewajarnya. Berikut ialah versi yang dipertingkatkan:
func mockGin() (*gin.Context, *httptest.ResponseRecorder) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) // Create a test request with query parameters 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 }
Setelah anda mengejek pengikatan pertanyaan, anda boleh menguji c.BindQuery dalam fungsi pengendali anda GetMaterialByFilter.
Ketergantungan Perkhidmatan Pengujian
Fungsi pengendali anda juga membuat panggilan ke perkhidmatan services.WeldprogService.GetMaterialByFilter. Untuk menjadikan panggilan ini boleh diuji, perkhidmatan itu hendaklah antara muka yang boleh disuntik sebagai kebergantungan pengendali anda.
Begini cara untuk melakukannya:
// Define an interface for your service type WeldprogService interface { GetMaterialByFilter(query *weldprogs.QueryParam) ([]weldprogs.Material, error) } // Inject the service into your handler as a context value func GetMaterialByFilter(c *gin.Context) { //... weldprogService := mustGetService(c) materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam) // ... } func mustGetService(c *gin.Context) WeldprogService { svc, exists := c.Get("svc_context_key") if !exists { panic("service was not set") } return svc.(WeldprogService) }
Kini, anda boleh mengejek perkhidmatan dalam unit anda menguji dan mengawal tingkah lakunya:
type mockSvc struct { } // Implement the WeldprogService interface on mockSvc func TestGetMaterialByFilter(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) // Set the mock service into the test context c.Set("svc_context_key", &mockSvc{}) GetMaterialByFilter(c) // ... }
Atas ialah kandungan terperinci Bagaimana Menguji Unit dengan Berkesan Fungsi Pengendali Go Gin dengan Pengikatan Data dan Ketergantungan Perkhidmatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!