Skip to main content

Constructor與DI

在前一篇文章提到,在golang中,如果要mock的話只能mock interface,因此,我們在做依賴注入的時候就要特別注意注入的內容都要是以interface為主,才有辦法在測試的時候順利的被替換掉

舉例來說,假設我要透過http的方式來上傳圖片,我將需要的handler都掛在一個struct的method上,又因為要上傳資料的緣故,我們會希望這個上傳的功能可以在application中被實現,所以我們要先在application中放上一個可以上傳圖片的interface,那我們就可以這麼做

application/file_store.go

package application

type FileStorer interface {
UploadAsset(filename string, i []byte, s string) (link string, err error)
}

interface/api.go

type EchoServer struct {
fileStorer application.FileStorer
}

func (e *EchoServer) V1UploadAsset(ctx echo.Context) error {
link, err := e.fileStorer.UploadAsset(file.Filename, fileBytes.Bytes(), string(location))
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err)
}
return ctx.JSON(http.StatusOK, TempAsset{
Url: link,
})
}

從上面的程式碼中就可以觀察到,如果我們有一個struct可以實做UploadAsset,那api的功能就可以順利被執行了

所以這時候就可以用到前一篇介紹的mock的工具,就可以順利的實做出下方需要的程式

server := EchoServer{
fileStorer: mockFileStorer,
}