So erstellen Sie Unit-Tests mit Abhängigkeitsinjektion mit Golang

PHPz
Freigeben: 2024-02-11 15:42:08
nach vorne
367 Leute haben es durchsucht

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

php-Editor Youzi bringt Ihnen einen Artikel darüber, wie Sie mit Golang eine Unit-Test-Abhängigkeitsinjektion erstellen. In der Softwareentwicklung sind Unit-Tests ein entscheidender Teil, und die Abhängigkeitsinjektion ist ein häufig verwendetes Entwurfsmuster, das uns dabei helfen kann, Unit-Tests besser durchzuführen. In diesem Artikel wird kurz vorgestellt, wie man mit Golang die Abhängigkeitsinjektion implementiert, damit wir testbaren Code einfacher schreiben können. Lasst uns gemeinsam erkunden!

Frageninhalt

Zum Beispiel möchte ich eine Benutzer-API erstellen Mit einer Abhängigkeitsinjektionsstruktur wie dieser

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()
}
Nach dem Login kopieren

Dann möchte ich einen Komponententest für die Benutzererstellungs-API erstellen, aber ich möchte nicht tatsächlich mit der Datenbank interagieren oder simulieren. Da userUseCase ein Repository erfordert, bedeutet dies, dass wir ein simuliertes userRepository für die SaveUserToDB-Funktion erstellen.

Ist das die richtige Methode?

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

Workaround

Abhängigkeitsinjektion erfordert die tatsächliche Injektion der Abhängigkeiten. Bootstrap 正在创建其依赖项,因此可以说这不是依赖项注入。如果你在测试中使用了 Bootstrap , dann ist das definitiv keine Abhängigkeitsinjektion.

Du musst also func Bootstrap(config *BootstrapConfig) 至少更改为 func Bootstrap(config *BootstrapConfig, userRepository *repository.User).

Dann werden Sie in Ihrem Test 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)
    …
}
Nach dem Login kopieren

Bootstrap 不应创建任何依赖项,因此您应该将其应用于 userProduceruserUseCase Warte

Das obige ist der detaillierte Inhalt vonSo erstellen Sie Unit-Tests mit Abhängigkeitsinjektion mit Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!