栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在不创建实际网络连接的情况下测试依赖net.Conn的代码?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在不创建实际网络连接的情况下测试依赖net.Conn的代码?

您的问题很开放,因此不可能给您“正确答案”。但是我想我理解您遇到的困难。这个答案也是开放的,但是它应该使您回到正确的轨道上。

几天前,我写了一篇简短的文章,其中显示了您必须使用的原理。

在我举一些小例子说明您的测试如何工作之前,我们需要修正一个重要点:

我们 不测试网络包装 。我们假设 该文件包没有错误 ,但确实如此。这意味着 我们不在乎Go团队如何实现

SetReadDeadline
实现
SetWriteDeadline
。我们仅在程序中测试用法。

步骤1:重构代码

您没有发布任何代码段,因此我仅举一个简单的示例。我猜你有一个方法或函数,正在使用net包。

func myConn(...) error {  // You pre is here  c, err := net.Dial("tcp", "12.34.56.78:80")  c.setDeadline(t)  // More pre here}

能够测试您需要重构功能的功能,因此它仅使用net.Conn接口。为此,必须将

net.Dial()
调用移到函数之外。请记住,我们不想测试net.Dial函数。

新功能可能如下所示:

func myConn(c, net.Conn, ...) error {  // You pre is here  c.setDeadline(t)  // More pre here}

步骤2:实现net.Conn接口

为了进行测试,您需要实现net.Conn接口:

type connTester struct {    deadline time.Time}func (c *connTester) Read(b []byte) (n int, err error) {    return 0, nil}...func (c *connTester) SetDeadline(t time.Time) error {    c.deadline = t    return nil}...

完整的实现,包括小的类型检查:https :
//play.golang.org/p/taAmI61vVz

步骤3:测试

在测试时,我们并不关心

Dial()
方法,我们只是创建一个指向我们的测试类型的指针,该指针实现了net.Conn接口并将其放入您的函数中。然后,如果最后期限参数设置正确,我们将查看测试用例。

func TestMyConn(t *testing.T){  myconnTester = &connTester{}  err := myConn(myconnTester,...)  ...  if myconntester.deadline != expectedDeadline{  //Test fails  }}

因此,在测试时,您应该始终考虑要测试的功能。我认为对您真正想要编写的功能进行抽象是最困难的部分。在简单的单元测试中,您永远不要测试标准库的功能。希望这个例子可以帮助您重新走上正轨。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484339.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号