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
Lepaskan: 2024-12-29 20:36:11
asal
632 orang telah melayarinya

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
    // ... 
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan