首頁 > 後端開發 > Golang > 僅使用公共 api 對 alexedwards/scs 進行簡單測試

僅使用公共 api 對 alexedwards/scs 進行簡單測試

PHPz
發布: 2024-02-09 12:24:27
轉載
1183 人瀏覽過

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

php小編香蕉本文將介紹如何使用公共 API 對 Alex Edwards/SCS 進行簡單測試。 Alex Edwards/SCS 是一個用於會話管理的 PHP 函式庫,可輕鬆地在應用程式中管理使用者會話。透過使用公共 API 進行測試,我們可以驗證庫的功能和效能,並確保其在實際應用中的穩定性和可靠性。在本文中,我們將逐步指導您如何進行簡單的測試,並展示測試結果的分析和解釋。讓我們開始吧!

問題內容

此問題是此問題的後續問題。我想要對 https://pkg.go.dev/github.com/alexedwards/scs/[email protected] 進行簡單測試以進行驗證我想使用的功能。基本上,我只想將一些數據放入會話中,將其取出,並驗證是否相同。像這樣的東西:

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)
}
登入後複製

這會產生恐慌:scs:上下文中沒有會話資料。

我嘗試從httptest套件複製範例,但httptest.server沒有實作http.handler(缺少servehttp方法)。

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)
}
登入後複製

我還查看了 alexedwards/scs 儲存庫中的測試,但它們使用私有函數 addsessiondatatocontext。

在 go 中測試會話的最佳、最簡單的方法是什麼?

解決方法

我在你的程式碼中看到

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

sessionmanager.loadandsave(ts) // this line is incorrect
登入後複製

您正在嘗試將測試伺服器 (ts) 傳遞給 sessionmanager.loadandsave。這將不起作用,因為sessionmanager.loadandsave 需要http.handler,並且ts 的類型為*httptest.server,而不是http.handler

相反,您應該將實際的處理程序傳遞給 sessionmanager。在建立測試伺服器之前載入並儲存

為此,您可以使用sessionmanager.loadandsave 包裝實際的處理函數(它確實返回http.handler),然後再將其傳遞給httptest.newserver

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

ts := httptest.newserver(handler)
登入後複製

透過使用 sessionmanager.loadandsave 中間件包裝實際的處理程序函數來建立一個新的處理程序。然後將這個包裝的處理程序傳遞給 httptest.newserver

如果你把它們放在一起:

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)
}
登入後複製

以上是僅使用公共 api 對 alexedwards/scs 進行簡單測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板