返回信息流问题场景:假设有一个认证服务AuthenticatorServer,它的任务是从文件中读取用户名密码完成认证工作。功能代码如下:
```go
var (
internalError = errors.New("internal error")
infoError = errors.New("username or password error")
)
type AuthenticatorServer struct {
}
func NewAuthenticatorServer() *AuthenticatorServer {
return &AuthenticatorServer{}
}
func (a *AuthenticatorServer) Auth(username, password string) error {
passwdRead, err := a.readPasswordFromFile(username)
if err != nil {
return internalError
}
if passwdRead != password {
return infoError
}
return nil
}
// 这里的逻辑未完成
func (a *AuthenticatorServer) readPasswordFromFile(username string) (string, error) {
return "", nil
}
```
现在我想测试的是Auth这个函数,但是Auth依赖了readPasswordFromFile,而readPasswordFromFile里面进行了文件读写,所以我想在单元测试中临时修改readPasswordFromFile的行为(比如直接返回"123456", nil),请问有什么简单好用的办法吗?
目前知道两个做法,但是感觉都不太好:
1. 将readPasswordFromFile定义成包变量或者结构体变量,在测试时修改函数变量的值。这种做法总感觉有点别扭。
2. 使用接口io.Reader,可以在AuthenticatorServer结构体定义一个io.Reader接口,测试时传入strings.Reader即可。对于一个特别简单的IO操作,感觉特地在结构体内封装一个接口有点把问题复杂化的意思。
这是一条镜像帖。来源:北邮人论坛 / golang / #1478同步于 2019/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
【问题】golang单元测试时临时修改函数行为
sundayslove
2019/5/26镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
这个感觉跟我上面提到的方法二有点像,都是定义接口,然后测试时使用其它的实现。
【 在 paper777 的大作中提到: 】
: 抽象成read/write,怎么read/write可在ut中实现。