Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengejek `c.BindQuery` dan Panggilan Servis dalam Ujian Unit Fungsi Pengendali Gin?

Bagaimana Mengejek `c.BindQuery` dan Panggilan Servis dalam Ujian Unit Fungsi Pengendali Gin?

Susan Sarandon
Susan Sarandonasal
2024-12-29 08:53:10861semak imbas

How to Effectively Mock `c.BindQuery` and Service Calls in Gin Handler Function Unit Tests?

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!

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