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

PHPz
Freigeben: 2024-02-11 15:42:08
nach vorne
340 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 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) … }
Nach dem Login kopieren

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

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
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!