Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengolok-olok `c.BindQuery` Gin untuk Ujian Unit Berkesan?

Bagaimana untuk Mengolok-olok `c.BindQuery` Gin untuk Ujian Unit Berkesan?

Barbara Streisand
Barbara Streisandasal
2024-12-30 15:43:14507semak imbas

How to Mock Gin's `c.BindQuery` for Effective Unit Testing?

Pengendali Gin Mengejek c.BindQuery untuk Pengujian Unit

Isu

Ujian unit untuk fungsi pengendali Gin GetMaterialByFilter gagal apabila c.BindQuery dipanggil . Bagaimanakah isu ini boleh diselesaikan dengan mengejek fungsi?

Ikhtisar

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.

Pelaksanaan Olok-olok

Untuk mengejek c.BindQuery, ikut langkah ini:

  1. Memulakan *gin.Context dan *httptest.ResponseRecorder.
  2. Buat *http.Request dan tetapkan URL dan Pengepalanya seperti yang diperlukan.
  3. Mulakan pertanyaan permintaan (weldprogs.QueryParam) dan mengekodkannya ke dalam URL.RawQuery.
  4. Tetapkan permintaan kepada konteks Gin menggunakan c.Request = req.
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
}

Mengejek Ketergantungan Luaran

Selain itu, panggilan services.WeldprogService.GetMaterialByFilter(&queryParam) tidak boleh diuji dalam bentuk semasanya. Ia mestilah antara muka dan disuntik sebagai kebergantungan pengendali.

Menyuntik Ketergantungan

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)
}

Mengejek Ketergantungan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn