首頁  >  文章  >  後端開發  >  如何使用 Golang 建立單元測試依賴注入

如何使用 Golang 建立單元測試依賴注入

PHPz
PHPz轉載
2024-02-11 15:42:08348瀏覽

如何使用 Golang 创建单元测试依赖注入

php小編柚子為您帶來了一篇關於如何使用Golang建立單元測試依賴注入的文章。在軟體開發中,單元測試是至關重要的一部分,而依賴注入則是常用的設計模式,可以幫助我們更好地進行單元測試。本文將簡潔地介紹如何使用Golang來實現依賴注入,以便我們能夠更輕鬆地編寫可測試的程式碼。讓我們一起來探索吧!

問題內容

例如,我想建立一個使用者API 具有這樣的依賴注入結構

func Bootstrap(config *BootstrapConfig) {
// setup repositories
userRepository := repository.NewUserRepository(config.Log)
// setup producer
userProducer := messaging.NewUserProducer(config.Producer, config.Log)
// setup use cases
userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
// setup controller
userController := http.NewUserController(userUseCase, config.Log)
routeConfig := route.RouteConfig{
    App:               config.App,
    UserController:    userController,
}
routeConfig.Setup()
}

然後,我想為使用者建立 API 建立一個單元測試,但我不想與資料庫進行真正的互動或模擬。由於 userUseCase 需要一個儲存庫,這表示我們將為 SaveUserToDB 函數建立一個模擬 userRepository。

使用這樣的方法正確嗎?

mockRepo.On("SaveUserToDB", mock.Anything, mock.AnythingOfType("*repository.User")).Return(nil)

解決方法

依賴項注入需要實際注入相依性。 Bootstrap 正在建立其依賴項,因此可以說這不是依賴項注入。如果你在測試中使用了 Bootstrap ,那麼這絕對不是依賴注入。

所以你需要將 func Bootstrap(config *BootstrapConfig) 至少改為 func Bootstrap(config *BootstrapConfig, userRepository *repository.User)

然後,在您的測試中,您將 mockRepo 傳遞給 Bootstrap

func Bootstrap(config *BootstrapConfig, userRepository *repository.User) {
    // setup producer
    userProducer := messaging.NewUserProducer(config.Producer, config.Log)
    // setup use cases
    userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
    // setup controller
    userController := http.NewUserController(userUseCase, config.Log)
    routeConfig := route.RouteConfig{
        App:               config.App,
        UserController:    userController,
    }
    routeConfig.Setup()
}

func TestFoo(t *testing.T) {
    mockRepo := mocks.NewUserRepository(config.Log)
    Bootstrap(config, mockRepo)
    mockRepo.On("SaveUserToDB", mock.Anything).Return(nil)
    …
}

Bootstrap 不應建立任何依賴項,因此您應該將其套用至 userProduceruserUseCase

以上是如何使用 Golang 建立單元測試依賴注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除