Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menguji Unit dengan Berkesan Fungsi Pengendali Go Gin dengan Pengikatan Data dan Ketergantungan Perkhidmatan?

Bagaimana Menguji Unit dengan Berkesan Fungsi Pengendali Go Gin dengan Pengikatan Data dan Ketergantungan Perkhidmatan?

Susan Sarandon
Susan Sarandonasal
2024-12-29 20:36:11646semak imbas

How to Effectively Unit Test Go Gin Handler Functions with Data Binding and Service Dependencies?

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!

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