Mengikat data JSON ke struct semasa permintaan HTTP ialah tugas biasa dalam aplikasi web . Ia boleh menjadi mencabar apabila menggunakan rangka kerja ujian yang memerlukan mengejek konteks permintaan. Khususnya, mengejek gin.Konteks menimbulkan kesukaran apabila cuba menguji fungsi yang bergantung pada kaedah BindJSONnya. Artikel ini menyediakan penyelesaian yang komprehensif untuk isu ini.
Pertama, adalah penting untuk membuat seketika gin ujian.Konteks dan menetapkan http.Permintaannya sebagai bukan nol:
w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Request = &http.Request{ Header: make(http.Header), }
Seterusnya, kita boleh mengejek POST JSON body menggunakan fungsi berikut:
func MockJsonPost(c *gin.Context /* the test context */, content interface{}) { c.Request.Method = "POST" // or PUT c.Request.Header.Set("Content-Type", "application/json") jsonbytes, err := json.Marshal(content) if err != nil { panic(err) } // the request body must be an io.ReadCloser // the bytes buffer though doesn't implement io.Closer, // so you wrap it in a no-op closer c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonbytes)) }
Fungsi ini menerima parameter antara muka kandungan{} yang boleh digabungkan ke dalam JSON menggunakan json.Marshal(). Ini boleh menjadi struct dengan teg JSON yang sesuai atau peta[rentetan]antara muka{}.
Berikut ialah cara menggunakan fungsi MockJsonPost dalam ujian:
func TestMyHandler(t *testing.T) { w := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(w) ctx.Request = &http.Request{ Header: make(http.Header), } MockJsonPost(ctx, map[string]interface{}{"foo": "bar"}) MyHandler(ctx) assert.EqualValues(t, http.StatusOK, w.Code) }
Untuk maklumat lanjut tentang ujian pengendali Gin, rujuk perkara berikut sumber:
Atas ialah kandungan terperinci Bagaimana untuk Mengejek BindJSON gin.Context untuk Ujian Pergi dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!