GOLANG宽泛接口在测试中的大用处

GOLANG宽泛接口在测试中的大用处,第1张

概述原文:https://gocn.io/publish/article/368 考虑测试一个函数: func request(ctx context.Context, hc *http.Client, api string) (err error) { var hreq *http.Request if hreq, err = http.NewRequest("GET", api,

原文:https://gocn.io/publish/article/368

考虑测试一个函数:

func request(ctx context.Context,hc *http.ClIEnt,API string) (err error) {    var hreq *http.Request    if hreq,err = http.NewRequest("GET",API,nil); err != nil {        return nil,errors.Wrap(err,"create request")    }    var hres *http.Response    if hres,err = hc.Do(hreq.WithContext(ctx)); err != nil {        return nil,"do request")    }    defer hres.Body.Close()    var body []byte    if body,err = IoUtil.ReadAll(hres.Body); err != nil {        return nil,"read body")    }    // ......    return nil}

这个函数的参数是一个*http.ClIEnt,而不是接口,这个该如何测试?内嵌一个http.ClIEnt像这样吗?

type mockhttpClIEnt struct { http.ClIEnt }

但是,问题是这样总是很恶心不是吗?就像如果是C++中,我们只能写一个mock类从要测试的类继承,但是我们只需要重写Do这个方法啊。

注意:对于C++而言,这是为何要求构造函数只是初始化,而不能包含逻辑,想象一个类在构造函数就访问了数据库,请问如何MOCK它?是做不到的,因此只能在构造函数初始化数据库的IP和账号等信息,提供connect这种函数连接数据库。

备注:上面只是拿数据库连接打个比方,实际上从MOCK角度来说,构造函数只能初始化内存对象,其他的应该啥也不干。

在GolANG中,有个非常牛逼的方法,就是创建一个私有的接口,使用时用接口:

type httpDoer interface { Do(req *http.Request) (*http.Response,error) }func request(ctx context.Context,hc httpDoer,API string) (err error) {    // ......

可以发现,很神奇的是,调用者也可以给*http.ClIEnt,对这个改动一无所知,这难道不是极其巧妙的设计吗?我们在mock中只需要mock这个方法就可以了。

一行代码处,深藏功与名~

总结

以上是内存溢出为你收集整理的GOLANG宽泛接口在测试中的大用处全部内容,希望文章能够帮你解决GOLANG宽泛接口在测试中的大用处所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1276987.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存