Как смоделировать memcache в go lang для модульного тестирования?

Я хочу смоделировать данные кэша memcache в go lang, чтобы избежать авторизации, которую я пробовал с 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)

}

пытался издеваться, используя гомок

package mock_utils

gen mock для утилит для контроллера доступа get (1) Определите интерфейс, который вы хотите смоделировать.

(2) Используйте mockgen для создания макета из интерфейса. (3) Используйте макет в тесте:

1 ответ

Вам нужно спроектировать свой код так, чтобы каждый такой доступ к сервису происходил через реализацию интерфейса. В вашем случае вы должны в идеале создать такой интерфейс, как

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

Ваш MemcacheStruct должен реализовать этот интерфейс, и все ваши вызовы, связанные с memcache, должны происходить оттуда. Как в вашем случае GetAccessToken должен позвонить cacheInterface.get(key) где ваш cacheInterface должен ссылаться на реализацию memcache этого интерфейса. Это лучший способ разработки ваших программ go, и это не только поможет вам в написании тестов, но и поможет в случае, если, скажем, вы хотите использовать другую базу данных в памяти для помощи в кэшировании. Как например, скажем, в будущем, если вы хотите использовать redis в качестве кеш-хранилища, тогда все, что вам нужно изменить, - это создать новую реализацию этого интерфейса.

Другие вопросы по тегам