Golang 依赖注入(Dependency Injection)

简介: 在各种大工程中少不了各种测试,其中 TDD 就是非常流行的一种,在前端开发中用的比较多的 [Jest](https://github.com/facebook/jest) 就是一种,在 Golang 开发命令行工具的时候也是需要 DI 这种模式来实现命令行测试的。

Dependency Injection 🧪

依赖注入是目前很多优秀框架都在使用的一个设计模式。
Dependency Injection 常常简称为:DI。它是实现控制反转(Inversion of Control – IoC)的一个模式。

在各种大工程中少不了各种测试,其中 TDD 就是非常流行的一种,在前端开发中用的比较多的 Jest 就是一种,在 Golang 开发命令行工具的时候也是需要 DI 这种模式来实现命令行测试的。因为传统的测试室获取不到命令行的输入输出的。

工程意图

仓库:https://github.com/guzhongren/TDD/tree/master/10.dependency-injection
编写一个命令行工具库,打包并运行程序,根据工具名称后面的名称来显示 'Hello, + 名称'

简化程序

我们知道 golang 打包后就是一个可执行程序,程序名称根据你指定的名称显示,那么要实现这个工具就是需要接收到程序名后面的参数并显示出来。但本次的重点是实现 DI, 所以我们将重点放在命令行的测试与实现上。
我们只实现 Greet 函数的 DI 就可以了。

初始化工程

go mod init dependency-injection

按照惯例,测试的函数需要以 Test 开头,参数为 *testing.T 类型

Test

  • 测试先行
func TestGreet(t *testing.T) {
    // 申明 buffer,准备接受数据, 因为bytes.Buffer, 重点:bytes.Buffer实现了 io.Writer
    buffer := bytes.Buffer{}
    // 将buffer 传入,此时就是依赖注入的入口,
    Greet(&buffer, "chris")
    // 获取程序运行的结果
    got := buffer.String()
    // 期望值
    want := "Hello, chris"
    // 测试判断
    if got != want {
        t.Errorf(`got %s, want %s`, got, want)
    }
}
  • 运行 go test, 程序会报错,因为没有实现 Greet 函数。
  • 最小化的实现 Repeat
// Greet 打印问候
func Greet(w io.Writer, name string) {
    fmt.Fprintf(w, "Hello, "+name)
}

重点说明,命令行的测试需要将结果打印在命令行窗口中,如果没有测试,我们可以用 fmt.Printf 等打印函数将结果打印出来,但是,
测试需要拿到打印的内容,就需要将内容用标准输出;当然可以变相的先用其他打印函数将结果打印出来,然后再将结果 return 出去,
在测试中,接受返回值,再比较;这样做不标准而已,学了今天内容其实就可以用 DI 来解决了。

运行测试

  • 基本测试
$ go test
PASS
ok      dependency-injection    0.006s

总结

基本测试很简单,不用解读了。作为开发者,我们应该用最直接的工具来保证我们程序的健壮性,而不一定要绕个弯来解决问题,如上面的打印结果的测试。

目录
相关文章
|
6月前
|
搜索推荐 Go 开发者
Go模块与依赖管理:构建稳定、可维护的项目生态
【2月更文挑战第9天】Go模块是Go语言从1.11版本开始引入的一个新的依赖管理工具,它改变了以往通过GOPATH管理项目依赖的方式,为Go开发者带来了更加灵活、高效的依赖管理方式。本文将深入探讨Go模块与依赖管理的概念、使用方法和最佳实践,帮助读者更好地理解和应用Go模块,构建稳定、可维护的项目生态。
|
12月前
|
JSON Go 数据处理
使用Go模块进行依赖管理
摘要:本文将介绍Go语言中的模块(module)概念,以及如何使用Go模块进行依赖管理。我们会探讨模块的基本概念、使用方法、配置和依赖关系管理等方面的内容。
|
3月前
|
Go API 开发工具
Go etcd 的依赖问题终于解决了。。。
Go etcd 的依赖问题终于解决了。。。
|
4月前
|
存储 Linux Go
GO 项目依赖管理:go module总结
GO 项目依赖管理:go module总结
63 0
|
3月前
|
人工智能 IDE Go
go mod 依赖管理
go mod 依赖管理
37 1
|
3月前
|
安全 Go 开发者
掌握 Go 语言的依赖关系管理
【8月更文挑战第31天】
35 0
|
5月前
|
存储 缓存 JSON
Go Modules:Go语言依赖管理的新篇章
Go Modules是Go 1.11引入的依赖管理标准,解决`GOPATH`的依赖冲突问题。
99 1
|
6月前
|
存储 Go
Golang深入浅出之-Go语言依赖管理:GOPATH与Go Modules
【4月更文挑战第27天】Go语言依赖管理从`GOPATH`进化到Go Modules。`GOPATH`时代,项目结构混乱,可通过设置多个工作空间管理。Go Modules自Go 1.11起提供更现代的管理方式,通过`go.mod`文件控制依赖。常见问题包括忘记更新`go.mod`、处理本地依赖和模块私有化,可使用`go mod tidy`、`replace`语句和`go mod vendor`解决。理解并掌握Go Modules对现代Go开发至关重要。
109 2
|
6月前
|
数据建模 Go vr&ar
idea配置go依赖下载
idea配置go依赖下载
162 0
|
存储 JSON NoSQL
Golang 依赖注入:入门篇
Golang 依赖注入:入门篇
143 0