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
Lepaskan: 2024-12-29 08:53:10
asal
859 orang telah melayarinya

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

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

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

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!

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