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中文网其他相关文章!