亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何測試實現大猩猩上下文的函數

如何測試實現大猩猩上下文的函數

Go
瀟瀟雨雨 2021-08-23 16:35:59
我編寫了一個將數據保存到 redis 數據庫服務器的函數。挑戰在于我想測試這些功能,但不知道如何測試。我只是以某種方式開始功能package sessrage/* * Save data into redis database. In the common case, * the data will be only valid during a request. Use * hash datatype in redis. */import (    "../context"    "github.com/garyburd/redigo/redis"    "net/http")const (    protocol string = "tcp"    port     string = ":6379")func connectAndCloseRedis(connectCall func(con redis.Conn)) {    c, err := redis.Dial("tcp", ":6379")    defer c.Close()    if err != nil {        panic(err.Error())    }    connectCall(c)}func PostSessionData(r *http.Request, key, value string) {    go connectAndCloseRedis(func(con redis.Conn) {        sessionId := context.Get(r, context.JwtId).(string)        con.Do("HMSET", sessionId, key, value)    })}func GetSessionData(r *http.Request, key string) interface{} {    var result interface{}    sessionId := context.Get(r, context.JwtId).(string)    reply, _ := redis.Values(c.Do("HMGET", sessionId, key))    redis.Scan(reply, &result)    return result}和測試文件package sessrageimport (    //"fmt"    "../context"    . "github.com/smartystreets/goconvey/convey"    "github.com/stretchr/testify/assert"    "net/http"    "net/http/httptest"    "testing"    "time")var server *httptest.Servervar glrw http.ResponseWritervar glr *http.Requestfunc init() {    server = httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {        glrw = rw        glr = r        context.Set(glr, context.JwtId, "TestId")    }))}func TestPostAndGetSession(t *testing.T) {    Convey("POST and GET data on redis.", t, func() {        PostSessionData(glr, "key1", "value1")        time.Sleep(time.Second * 10)        v := GetSessionData(glr, "key1")        assert.Equal(t, "value1", v)    })}當我嘗試運行測試時an't load package: ......./sessrage.go:10:2: local import "../context" in non-local package和上下文包看起來像package contextimport (    "github.com/gorilla/context"    "net/http")我怎么了?那是我第一次結合 http 測試代碼。似乎很難測試。
查看完整描述

1 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

有幾個問題:

  • 不要使用相對導入路徑。

  • 使用而不是在每個操作上撥打 redis。

  • 如果多路復用器或調用鏈中的更高層在 goroutine 運行之前清除了 Gorilla 上下文,則 PostSessionData 匿名函數中對 sessionId := context.Get(r, context.JwtId).(string) 的調用可能會失敗。改為這樣做:

func PostSessionData(r *http.Request, key, value string) {

    c := pool.Get()

    defer c.Close()

    sessionId := context.Get(r, context.JwtId).(string)

    if err := c.Do("HMSET", sessionId, key, value); err != nil {

       // handle error

    }

}


查看完整回答
反對 回復 2021-08-23
  • 1 回答
  • 0 關注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號