教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 GOLANG宽泛接口在测试中的大用处

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

发布时间:2021-12-21   编辑:jiaochengji.com
教程集为您提供GOLANG宽泛接口在测试中的大用处等资源,欢迎您收藏本站,我们将为您提供最新的GOLANG宽泛接口在测试中的大用处资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

原文:https://gocn.vip/article/368

考虑测试一个函数:

<pre><code>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, errors.Wrap(err, "do request") } defer hres.Body.Close() var body []byte if body, err = ioutil.ReadAll(hres.Body); err != nil { return nil, errors.Wrap(err, "read body") } // ...... return nil } </code></pre>

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

<pre><code>type mockHttpClient struct { http.Client } </code></pre>

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

<blockquote>

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

</blockquote> <blockquote>

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

</blockquote>

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

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

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

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

到此这篇关于“GOLANG宽泛接口在测试中的大用处”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
GOLANG宽泛接口在测试中的大用处
19小接口的妙用
Go语言空接口类型(interface{})
C#泛型:泛型特点、泛型继承、泛型接口、泛型委托学习笔记
20.不要在函数参数中使用空接口
go mockweb接口_golang 单元测试(gotests、mockery自动生成)
Golang 复合数据类型:接口
学习单元测试,告别祈祷式编程
Golang | Go语言多态的实现与interface使用
golang和python有什么区别?

[关闭]
~ ~