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!
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) }
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) }
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?
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
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)
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) }
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!