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

仅使用公共 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 mainimport (    "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 进行简单测试的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2357405.html

(0)
上一篇 2025年3月1日 16:24:20
下一篇 2025年3月1日 16:24:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论