Heim >Backend-Entwicklung >Golang >So erstellen Sie Unit-Tests mit Abhängigkeitsinjektion mit Golang

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

PHPz
PHPznach vorne
2024-02-11 15:42:08418Durchsuche

如何使用 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()
}

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)

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)
    …
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen