开发者社区> 谷中仁> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

总结

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
60 0
【Go语言入门100题】025 正整数A+B (15 分) Go语言|Golang
L1-025 正整数A+B (15 分) Go语言|Golang 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
64 0
【Go语言入门100题】024 后天 (5 分) Go语言|Golang
L1-024 后天 (5 分) Go语言|Golang 如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
130 0
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
52 0
【Go语言入门100题】022 奇偶分家 (10 分) Go语言 | Golang
L1-022 奇偶分家 (10 分) Go语言|Golang 给定N个正整数,请统计奇数和偶数各有多少个?
28 0
【Go语言入门100题】021 重要的话说三遍 (5 分) Go语言 | Golang
L1-021 重要的话说三遍 (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行,除了每行的回车不能有任何多余字符。
47 0
【Go语言入门100题】020 帅到没朋友 (20 分) Go语言 Golang
L1-019 谁先倒 (15 分) Go语言|Golang 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。 注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个
71 0
+关注
126
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载