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中文網其他相關文章!