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!
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() }
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)
Abhängigkeitsinjektion erfordert die tatsächliche Injektion der Abhängigkeiten.Bootstrap
正在创建其依赖项,因此可以说这不是依赖项注入。如果你在测试中使用了Bootstrap
, dann ist das definitiv keine Abhängigkeitsinjektion.
Du musst alsofunc Bootstrap(config *BootstrapConfig)
至少更改为func Bootstrap(config *BootstrapConfig, userRepository *repository.User)
.
Dann werden Sie in Ihrem TestmockRepo
传递给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
不应创建任何依赖项,因此您应该将其应用于userProducer
、userUseCase
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!