php Editor Banana Cet article expliquera comment utiliser l'API publique pour effectuer un test simple sur Alex Edwards/SCS. Alex Edwards/SCS est une bibliothèque PHP de gestion de sessions qui facilite la gestion des sessions utilisateur dans votre application. En testant avec l'API publique, nous pouvons vérifier la fonctionnalité et les performances de la bibliothèque et garantir sa stabilité et sa fiabilité dans les applications du monde réel. Dans cet article, nous vous guiderons étape par étape sur la façon d’effectuer un test simple et vous montrerons l’analyse et l’interprétation des résultats du test. commençons!
Cette question fait suite à cette question. Je souhaite faire un test simple sur https://pkg.go.dev/github.com/alexedwards/scs/[email protected] pour vérifier la fonctionnalité que je souhaite utiliser. Fondamentalement, je veux juste mettre des données dans la session, les supprimer et vérifier que c'est la même chose. Quelque chose comme ça :
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) }
Cela va générer une panique : scs : Aucune donnée de session en contexte.
J'ai essayé de copier l'exemple du package httptest, mais httptest.server n'implémente pas http.handler (la méthode servehttp est manquante).
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) }
J'ai également regardé les tests dans le référentiel alexedwards/scs mais ils utilisent la fonction privée addsessiondatatocontext.
Quelle est la meilleure et la plus simple manière de tester une séance en go ?
Je l'ai vu dans votre code
ts := httptest.newserver(http.handlerfunc(func(w http.responsewriter, r *http.request) { // ... })) sessionmanager.loadandsave(ts) // this line is incorrect
Vous essayez d'ajouter un serveur de test (ts
) 传递给 sessionmanager.loadandsave
。这将不起作用,因为 sessionmanager.loadandsave
需要 http.handler
,并且 ts
的类型为 *httptest.server
,而不是 http.handler
.
Au lieu de cela, vous devez transmettre le véritable gestionnaire à sessionmanager。在创建测试服务器之前加载并保存
.
Pour cela, vous pouvez utiliser sessionmanager.loadandsave
包装实际的处理函数(它确实返回 http.handler
),然后再将其传递给 httptest.newserver
.
handler := sessionmanager.loadandsave(http.handlerfunc(func(w http.responsewriter, r *http.request) { // ... logic here ... })) ts := httptest.newserver(handler)
En utilisant sessionmanager.loadandsave
中间件包装实际的处理程序函数来创建一个新的处理程序。然后将这个包装的处理程序传递给 httptest.newserver
.
Si vous les assemblez :
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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!