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 进行简单测试的详细内容,更多请关注编程网其它相关文章!