文章未來將更新於:
https://kevinyay945.com/golang-project-design/2023/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,
}