Maison  >  Article  >  développement back-end  >  Test simple d'alexedwards/scs en utilisant uniquement l'API publique

Test simple d'alexedwards/scs en utilisant uniquement l'API publique

PHPz
PHPzavant
2024-02-09 12:24:271129parcourir

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

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!

Contenu de la question

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 ?

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer