Einfacher Test von alexedwards/scs nur mit öffentlicher API

PHPz
Freigeben: 2024-02-09 12:24:27
nach vorne
1133 Leute haben es durchsucht

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

php Editor Banana In diesem Artikel wird erläutert, wie Sie die öffentliche API verwenden, um einen einfachen Test auf Alex Edwards/SCS durchzuführen. Alex Edwards/SCS ist eine PHP-Bibliothek für die Sitzungsverwaltung, die die Verwaltung von Benutzersitzungen in Ihrer Anwendung vereinfacht. Durch Tests mit der öffentlichen API können wir die Funktionalität und Leistung der Bibliothek überprüfen und ihre Stabilität und Zuverlässigkeit in realen Anwendungen sicherstellen. In diesem Artikel führen wir Sie Schritt für Schritt durch die Durchführung eines einfachen Tests und zeigen die Analyse und Interpretation der Testergebnisse. Lasst uns beginnen!

Frageninhalt

Diese Frage ist eine Fortsetzung dieser Frage. Ich möchte einen einfachen Test auf https://pkg.go.dev/github.com/alexedwards/scs/[email protected] durchführen, um die Funktionalität zu überprüfen, die ich verwenden möchte. Im Grunde möchte ich nur ein paar Daten in die Sitzung einfügen, sie herausnehmen und überprüfen, ob sie identisch sind. Etwa so:

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)
}
Nach dem Login kopieren

Dies wird eine Panik erzeugen: scs: Keine Sitzungsdaten im Kontext.

Ich habe versucht, das Beispiel aus dem httptest-Paket zu kopieren, aber httptest.server implementiert http.handler nicht (servehttp-Methode fehlt).

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)
}
Nach dem Login kopieren

Ich habe mir auch die Tests im alexedwards/scs-Repository angesehen, aber sie verwenden die private Funktion addsessiondatatocontext.

Was ist der beste und einfachste Weg, eine Sitzung in Go zu testen?

Lösung

Ich habe es in Ihrem Code gesehen

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

sessionmanager.loadandsave(ts) // this line is incorrect
Nach dem Login kopieren

Sie versuchen, einen Testserver hinzuzufügen (ts) 传递给 sessionmanager.loadandsave。这将不起作用,因为 sessionmanager.loadandsave 需要 http.handler,并且 ts 的类型为 *httptest.server,而不是 http.handler.

Stattdessen sollten Sie den eigentlichen Handler an sessionmanager。在创建测试服务器之前加载并保存 übergeben.

Hierfür können Sie sessionmanager.loadandsave 包装实际的处理函数(它确实返回 http.handler),然后再将其传递给 httptest.newserver verwenden.

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

ts := httptest.newserver(handler)
Nach dem Login kopieren

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

Wenn man sie zusammenfügt:

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)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonEinfacher Test von alexedwards/scs nur mit öffentlicher API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!