Ujian mudah alexedwards/scs menggunakan api awam sahaja

PHPz
Lepaskan: 2024-02-09 12:24:27
ke hadapan
1129 orang telah melayarinya

仅使用公共 api 对 alexedwards/scs 进行简单测试

php Editor Banana Artikel ini akan memperkenalkan cara menggunakan API awam untuk menjalankan ujian mudah ke atas Alex Edwards/SCS. Alex Edwards/SCS ialah perpustakaan PHP untuk pengurusan sesi yang memudahkan untuk mengurus sesi pengguna dalam aplikasi anda. Dengan menguji dengan API awam, kami boleh mengesahkan kefungsian dan prestasi perpustakaan serta memastikan kestabilan dan kebolehpercayaannya dalam aplikasi dunia sebenar. Dalam artikel ini, kami akan membimbing anda langkah demi langkah tentang cara menjalankan ujian mudah dan menunjukkan analisis dan tafsiran keputusan ujian. Mari mulakan!

Kandungan soalan

Soalan ini adalah susulan kepada soalan ini. Saya ingin melakukan ujian mudah di https://pkg.go.dev/github.com/alexedwards/scs/[email protected] untuk mengesahkan fungsi yang saya mahu gunakan. Pada asasnya, saya hanya mahu memasukkan beberapa data ke dalam sesi, mengeluarkannya dan mengesahkan bahawa ia adalah sama. Sesuatu seperti ini:

func testscs_setgetissame1(t *testing.t) {
    sessionmanager := scs.new()
    req := httptest.newrequest("get", "/", nil)
    key := "boolean"
    expected := false
    sessionmanager.put(req.context(), key, expected)
    actual := sessionmanager.getbool(req.context(), key)
    assert.equal(t, expected, actual)
}
Salin selepas log masuk

Ini akan menjana panik: scs: Tiada data sesi dalam konteks.

Saya cuba menyalin contoh daripada pakej httptest, tetapi httptest.server tidak melaksanakan http.handler (kaedah servehttp tiada).

func TestScs_SetGetIsSame2(t *testing.T) {
    sessionManager := scs.New()

    ts := httptest.NewServer((http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, client")
        expected := true
        sessionManager.Put(r.Context(), "key", expected)
        actual := sessionManager.GetBool(r.Context(), "key")
        assert.Equal(t, expected, actual)
    })))
    defer ts.Close()

    res, err := http.Get(ts.URL)
    if err != nil {
        log.Fatal(err)
    }

    greeting, err := io.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s", greeting)

    sessionManager.LoadAndSave(ts)
}
Salin selepas log masuk

Saya juga melihat ujian dalam repositori alexedwards/scs tetapi mereka menggunakan fungsi peribadi addsessiondatatocontext.

Apakah cara terbaik dan termudah untuk menguji sesi semasa?

Penyelesaian

Saya melihatnya dalam kod anda

ts := httptest.newserver(http.handlerfunc(func(w http.responsewriter, r *http.request) {
    // ...
}))

sessionmanager.loadandsave(ts) // this line is incorrect
Salin selepas log masuk

Anda cuba menambah pelayan ujian (ts) 传递给 sessionmanager.loadandsave。这将不起作用,因为 sessionmanager.loadandsave 需要 http.handler,并且 ts 的类型为 *httptest.server,而不是 http.handler.

Sebaliknya, anda harus menyerahkan pengendali sebenar kepada sessionmanager。在创建测试服务器之前加载并保存.

Untuk ini anda boleh menggunakan sessionmanager.loadandsave 包装实际的处理函数(它确实返回 http.handler),然后再将其传递给 httptest.newserver.

handler := sessionmanager.loadandsave(http.handlerfunc(func(w http.responsewriter, r *http.request) {
    // ... logic here ...
}))

ts := httptest.newserver(handler)
Salin selepas log masuk

Dengan menggunakan sessionmanager.loadandsave 中间件包装实际的处理程序函数来创建一个新的处理程序。然后将这个包装的处理程序传递给 httptest.newserver.

Jika anda menggabungkannya:

package main

import (
    "fmt"
    "github.com/alexedwards/scs/v2"
    "github.com/stretchr/testify/assert"
    "io"
    "log"
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestScs_SetGetIsSame2(t *testing.T) {
    sessionManager := scs.New()

    // Create a handler and wrap it using sessionManager.LoadAndSave
    handler := sessionManager.LoadAndSave(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, client")
        expected := true
        sessionManager.Put(r.Context(), "key", expected)
        actual := sessionManager.GetBool(r.Context(), "key")
        assert.Equal(t, expected, actual)
    }))

    // Create a test server with the handler
    ts := httptest.NewServer(handler)
    defer ts.Close()

    // Make a request to the server
    res, err := http.Get(ts.URL)
    if err != nil {
        log.Fatal(err)
    }

    // Read the response body
    greeting, err := io.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }

    // Print the response body
    fmt.Printf("%s", greeting)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Ujian mudah alexedwards/scs menggunakan api awam sahaja. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!