我編寫了一個將數據保存到 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
}
}
- 1 回答
- 0 關注
- 238 瀏覽
添加回答
舉報
0/150
提交
取消