Mocking
​你可以在这里找到本章的所有代码​

现在需要你写一个程序,从 3 开始依次向下,当到 0 时打印 「GO!」 并退出,要求每次打印从新的一行开始且打印间隔一秒的停顿。

3
2
1
Go!
我们将通过编写一个 Countdown 函数来处理这个问题,然后放入 main 程序,所以它看起来这样:

package main

func main() {
Countdown()
}
虽然这是一个非常简单的程序,但要完全测试它,我们需要像往常一样采用迭代的、测试驱动的方法。

所谓迭代是指:确保我们采取最小的步骤让软件可用。

我们不想花太多时间写那些在被攻击后理论上还能运行的代码,因为这经常导致开发人员陷入开发的无底深渊。尽你所能拆分需求是一项很重要的技能,这样你就能拥有可以工作的软件。

下面是我们如何划分工作和迭代的方法:

打印 3

打印 3 到 Go!

在每行中间等待一秒

先写测试
我们的软件需要将结果打印到标准输出界面。在 DI(依赖注入) 的部分,我们已经看到如何使用 DI 进行方便的测试。

func TestCountdown(t *testing.T) {
buffer := &bytes.Buffer{}

Countdown(buffer)got := buffer.String()
want := "3"if got != want {t.Errorf("got %q want %q", got, want)
}

}
如果你对 buffer 不熟悉,请重新阅读前面的部分。

我们清楚,我们的目的是让 Countdown 函数将数据写到某处,io.writer 就是作为 Go 的一个接口来抓取数据的一种方式。

在 main 中,我们将信息发送到 os.Stdout,所以用户可以看到 Countdown 的结果打印到终端

在测试中,我们将发送到 bytes.Buffer,所以我们的测试能够抓取到正在生成的数据

尝试并运行测试
./countdown_test.go:11:2: undefined: Countdown

为测试的运行编写最少量的代码,并检查失败测试的输出
定义 Countdown 函数

func Countdown() {}
再次尝试运行

./countdown_test.go:11:11: too many arguments in call to Countdown
have (*bytes.Buffer)
want ()
编译器正在告诉你函数的问题,所以更正它

func Countdown(out *bytes.Buffer) {}
countdown_test.go:17: got ‘’ want ‘3’

这样结果就完美了!

编写足够的代码使程序通过
func Countdown(out *bytes.Buffer) {
fmt.Fprint(out, “3”)
}
我们正在使用 fmt.Fprint 传入一个 io.Writer(例如 *bytes.Buffer)并发送一个 string。这个测试应该可以通过。

重构代码
虽然我们都知道 *bytes.Buffer 可以运行,但最好使用通用接口代替。

func Countdown(out io.Writer) {
fmt.Fprint(out, “3”)
}
重新运行测试他们应该就可以通过了。

为了完成任务,现在让我们将函数应用到 main 中。这样的话,我们就有了一些可工作的软件来确保我们的工作正在取得进展。

package main

import (
“fmt”
“io”
“os”
)

func Countdown(out io.Writer) {
fmt.Fprint(out, “3”)
}

func main() {
Countdown(os.Stdout)
}
尝试运行程序,这些成果会让你感到神奇。

当然,这仍然看起来很简单,但是我建议任何项目都使用这种方法。在测试的支持下,将功能切分成小的功能点,并使其首尾相连顺利的运行。

接下来我们可以让它打印 2,1 然后输出「Go!」。

先写测试
通过花费一些时间让整个流程正确执行,我们就可以安全且轻松的迭代我们的解决方案。我们将不再需要停止并重新运行程序,要对它的工作充满信心因为所有的逻辑都被测试过了。

func TestCountdown(t *testing.T) {
buffer := &bytes.Buffer{}

Countdown(buffer)got := buffer.String()
want := `3

2
1
Go!`

if got != want {t.Errorf("got %q want %q", got, want)
}

}
反引号语法是创建 string 的另一种方式,但是允许你放置东西例如放到新的一行,对我们的测试来说是完美的。

GoLang - Go中Mocking(1)相关推荐

  1. 在golang编程中总结的基础语法及常见的问题

    写下,自己在用golang开发中,用到的东西,有啥写啥. 今个就写下golang中的控制语句  if  else.for.switch.goto,这几个方面. if 判断对比 package main ...

  2. Golang字符串中常用的函数

    Golang字符串中常用的函数 说明: 字符串在我们程序开发中,使用的是非常多的,常用的函数需要同学们掌握: 下面列出20种常用的字符串函数: 1)统计字符串的长度,按字节len(str) 2)字符串 ...

  3. golang roadrunner中文文档(一)基础介绍

    2021年5月24日14:34:05 golang roadrunner中文文档(一)基础介绍 golang roadrunner中文文档(二)PHP Workers golang roadrunne ...

  4. sessionlistener方法中获取session中存储的值报空指针异常_从Golang实践中得到的教训...

    当使用复杂的分布式系统时,可能会遇到并发处理的需求.我们知道golang的协程是处理并发的利器之一,加上Golang为静态类型和编译型使得其在企业中使用越来越广泛.Mode.net公司系统每天要处理实 ...

  5. 在Golang开发中使用Redis

    周五上班的主要任务是在公司老平台上用redis处理一个队列问题,顺便复习了一下redis操作的基础知识,回来后就想着在自己的博客demo里,用redis来优化一些使用场景,学习一下golang开发下r ...

  6. 问题 | golang编程中的坑

    文章目录 背景 坑一:遍历遇上指针 例子1: 例子2: 为什么? 解决方案 坑二:切片和闭包 例子 为什么 解决方案 坑三:切片的append 例子 为什么 解决方案 坑四:time包自定义格式的坑 ...

  7. golang工作中常用的一些库

    1.json解析 非常好用的json解析工具库 github.com/tidwall/gjson 高性能json库,替代encoding/json https://github.com/json-it ...

  8. 解决 golang json 中 invalid character ‘\r‘ in string literal 报错

    type Demo struct {Content string `json:"content"` }func main() {var demo Demostr := " ...

  9. golang: 密码中允许出现数字、大写字母、小写字母、特殊字符,但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可)

    要求: 密码中允许出现数字.大写字母.小写字母.特殊字符(.@$!%*#_~?&^),但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可) package mainimport ...

  10. golang 生态中不错的组件

    觉得不错的Golang优秀组件.算是个人笔记吧,只有介绍,没有使用说明. web 框架 Go的框架有很多很多,但至今还没有一款能和Spring媲美的神级框架出现.所以大神都是自己直接写,不用框架.这里 ...

最新文章

  1. redis教程(五)之redis数据类型
  2. 牛顿迭代法(Newton's Method)
  3. python 办公_python 让办公变得自动化
  4. boost::safe_numerics模块实现混合类型产生令人惊讶的结果的测试程序
  5. lowerBound与upperBound
  6. 文本挖掘(part1)--文本挖掘概述
  7. server sql top速度变慢解决方案_SQL Server数据库查询速度慢的原因和解决方法
  8. hook 输入法 android,安卓输入法输入性能评测流程
  9. POJ 2976 裸的01分数规划
  10. Mysql之各种各样的函数啦
  11. 机载L波段卫星通信-市场现状及未来发展趋势
  12. 通俗易懂的数学建模示例(一)
  13. 使用阿里云发送短信验证码教程(简单易学)
  14. qt.qpa.xcb: could not connect to display解决
  15. 灰色模型GM与时间无关
  16. JeecgBoot全套开发环境搭建
  17. 石川 :学术界、管理人、投资者视角下的因子投资
  18. 小白的jquery学习之路之04效果新闻向上无缝循环显示
  19. mysql错误42000_mysql5.7 异常ERROR 1055 (42000)
  20. 自媒体矩阵mcn是什么怎么做自媒体mcn矩阵运营

热门文章

  1. 项目2:数据可视化(五)绘制世界人口地图
  2. 尚医通笔记-后台管理
  3. linux kettle命令,Linux下用命令来执行kettle文件资源库的文件ktr与kjb的方法
  4. D.Stressful Training--Educational Codeforces Round 61 (Rated for Div. 2)(二分+优先队列)
  5. 微信开放平台授权java_微信开放平台授权登录(java版)
  6. 深度学习——词汇embedded、Beam Search
  7. 下载jupyterlab中的文件夹
  8. 电压放大倍数公式运放_运算放大器的放大倍数如何计算
  9. 揭秘:带你玩转陪玩圈,潮流玩法轻松赚钱
  10. 韦恩图——你学会了吗?