如何在go lang中模拟memcache进行单元测试?

时间:2018-04-06 08:36:46

标签: go memcached gomock

我想在go lang中模拟memcache缓存数据以避免authhorization  我尝试使用gomock但无法解决,因为我没有任何界面。

func getAccessTokenFromCache(accessToken string)

func TestSendData(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
mockObj := mock_utils.NewMockCacheInterface(mockCtrl)
mockObj.EXPECT().GetAccessToken("abcd") 
var jsonStr = []byte(`{
    "devices": [
        {"id": "avccc",

        "data":"abcd/"
        }
            ]
}`)
req, err := http.NewRequest("POST", "/send/v1/data", 
bytes.NewBuffer(jsonStr))
req.Header.Set("Content-Type", "application/json")
 req.Header.Set("Authorization", "d958372f5039e28")

rr := httptest.NewRecorder()
handler := http.HandlerFunc(SendData)
handler.ServeHTTP(rr, req)
if status := rr.Code; status != 200 {
    t.Errorf("handler returned wrong status code: got %v want %v",
        status, http.StatusOK)
}
expected := `{"error":"Invalid access token"}`
body, _ := ioutil.ReadAll(rr.Body)

if string(body) != expected {
    t.Errorf("handler returned unexpected body: got %v want %v",
        string(body), expected)
}




func SendData(w http.ResponseWriter, r *http.Request) {

accessToken := r.Header.Get(constants.AUTHORIZATION_HEADER_KEY)

t := utils.CacheType{At1: accessToken}
a := utils.CacheInterface(t)
isAccessTokenValid := utils.CacheInterface.GetAccessToken(a, accessToken)

if !isAccessTokenValid {
    RespondError(w, http.StatusUnauthorized, "Invalid access token")
    return
}
response := make(map[string]string, 1)
response["message"] = "success"
RespondJSON(w, http.StatusOK, response)

}

尝试使用gomock

进行模拟
package mock_utils

gen mock for utils for get access controler (1)定义您想要模拟的界面。

(2)使用mockgen从界面生成模拟。 (3)在测试中使用模拟:

1 个答案:

答案 0 :(得分:0)

您需要构建代码,以便通过接口实现对服务进行每次此类访问。在您的情况下,理想情况下应创建一个类似

的界面
type CacheInterface interface {
      Set(key string, val interface{}) error
      Get(key string) (interface{},error)
}

您的MemcacheStruct应该实现此接口,并且所有与memcache相关的调用都应该从那里发生。就像你的情况一样GetAccessToken应该调用cacheInterface.get(key),其中你的cacheInterface应该引用这个接口的memcache实现。这是设计go程序的一种更好的方法,这不仅可以帮助你编写测试,还可以帮助我们说你想使用不同的内存数据库来帮助缓存。就像前面一样,让我们​​说将来如果你想使用redis作为你的缓存存储,那么你需要改变的就是创建一个这个界面的新实现。