Mengejek c.BindQuery dalam Ujian Unit Fungsi Pengendali Gin
Ujian unit Fungsi pengendali Go Gin sering melibatkan mengejek operasi tertentu untuk mengasingkan dan menguji khusus senario. Satu operasi sedemikian ialah c.BindQuery, yang mengikat parameter rentetan pertanyaan kepada struct yang diberikan.
Apabila menguji GetMaterialByFilter, ujian akan gagal disebabkan oleh ralat yang berkaitan dengan akses memori tidak sah atau penolakan penunjuk nil. Ralat ini berpunca daripada fakta bahawa c.BindQuery tidak dimulakan dengan betul dengan permintaan HTTP yang sah.
Untuk mengejek c.BindQuery, buat http.Request dan tetapkan medan URL dan URL.RawQuerynya. Ini membolehkan anda mensimulasikan permintaan yang akan diterima oleh fungsi pengendali:
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{/* ... */} 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 }
Panggilan Perkhidmatan Menguji
Fungsi pengendali juga membuat panggilan ke perkhidmatan kaedah, perkhidmatan.WeldprogService.GetMaterialByFilter. Untuk menguji panggilan ini, perkhidmatan mesti boleh disuntik, sama ada melalui tandatangan fungsi pengendali atau dengan menetapkannya sebagai nilai konteks Gin.
Jika perkhidmatan adalah antara muka, ia boleh disuntik menggunakan kaedah c.Set :
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) }
Ejek perkhidmatan dalam ujian unit dengan melaksanakan antara muka yang diperlukan dan menetapkannya sebagai konteks perkhidmatan nilai:
type mockSvc struct {} func (mockSvc) GetMaterialByFilter(*weldprogs.QueryParam) (*materialByFilter, error) { /* ... */} func TestGetMaterialByFilter(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Set("svc_context_key", &mockSvc{}) GetMaterialByFilter(c) // ... }
Dengan mengikuti langkah ini, anda boleh mengejek kedua-dua c.BindQuery dan panggilan perkhidmatan untuk mengasingkan dan menguji fungsi pengendali Gin anda dengan berkesan.
Atas ialah kandungan terperinci Bagaimana Mengejek `c.BindQuery` dan Panggilan Servis dalam Ujian Unit Fungsi Pengendali Gin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!