[英]Golang net package mocking
我正在尝试学习在我的个人项目中使用 golang 编写测试。
我的项目中的许多功能都使用net
包,但是由于我是新手,我不知道如何模拟与主机设备交互的包(例如net
one)中的功能。
为了使我的问题更具体,我有一个类似的功能:
func NewThingy(ifcName string) (*Thingy, error) {
if ifc, err := net.InterfaceByName(ifcName); err == nil {
return nil, fmt.Errorf("Interface name %s already assigned on the host", ifcName)
}
....
return &Thingy{
ifc: ifc,
}, nil
}
Thingy 被明确定义为:
type Thingy struct {
ifc *net.Interface
}
任何人都可以给我任何提示如何去测试这样的代码?
谢谢
简短的回答是你不能嘲笑这样的事情。 Go 是一种静态编译语言,因此与 ruby 或其他动态语言不同,它不支持动态地神奇地重写固定函数调用。
如果你真的想测试它,你有两个明显的选择:
定义NewThingy
以获取类型匹配net.InterfaceByName
的函数指针。 将该函数传递给对该函数的所有“真实”调用,但在您的测试中传递一个虚拟函数指针。 然而,这会稍微减慢代码的速度,并且读或写起来并不愉快。
要求您的测试环境使用合法数据。 根据您的要求可能或不可能,但有一些软件包可能会有所帮助(我出于类似目的编写了https://github.com/eapache/peroxide ,但它不处理接口,所以它可能不是你在找什么)。
我遇到了同样的问题,最终使用这个包来模拟: https : //github.com/foxcpp/go-mockdns
srv, _ := mockdns.NewServer(map[string]mockdns.Zone{
"example.org.": {
A: []string{"1.2.3.4"},
},
}, false)
defer srv.Close()
srv.PatchNet(net.DefaultResolver)
defer mockdns.UnpatchNet(net.DefaultResolver)
addrs, err := net.LookupHost("example.org")
fmt.Println(addrs, err)
它还有一个选项来创建一个模拟解析器对象,但是你必须使用依赖注入来注入要在内部使用的模拟解析器:
r := mockdns.Resolver{
Zones: map[string]mockdns.Zone{
"example.org.": {
A: []string{"1.2.3.4"},
},
},
}
addrs, err := r.LookupHost(context.Background(), "example.org")
fmt.Println(addrs, err)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.