最近帮忙给一个项目补充单元测试,有一些单测比较不好写, 到网上查了一下,发现有很多有意思的写法,特此总结一下
net.dial 方法的单测
如果我们代码里面使用了net.Dial()
去访问外部的tcp or udp 端口,然后使用返回的Conn
对象去处理里面的数据,我们该如何对这个Conn
对象进行mock呢?
- 最好想的办法是自己实现一个server端,使用
net.Listen()
本地的一个端口,并且撰写自己的handler方法,在handler方法里面返回想要的值。最后在单测里面直接调用这个端口就可以在返回的conn
对象中获取到mock的值了。
下面写一个简单的例子
go func() {
conn, err := net.Dial("tcp", 3000)
if err != nil {
xxx
}
defer conn.close()
xxx
}
l, err := net.Listen("tcp", 3000)
defer l.Close()
for {
conn, err := l.Accept()
defer conn.Close()
handle(conn)
}
- 其实最简单的方法是这种
server, client := net.Pipe()
go func(){
server.Close()
}()
client.Close()