我有一小段代码来解释我试图测试的代码库。为了使问题简短,我跳过了检查错误。
func lastCNAME(domain string) (lastCNAME string) {
ns := "8.8.8.8:53"
c := dns.Client{}
m := dns.Msg{}
m.SetQuestion(domain, dns.TypeA)
r, _, _ := c.Exchange(&m, ns)
// Last CNAME
for _, ans := range r.Answer {
cname, ok := ans.(*dns.CNAME)
if ok {
lastCNAME = cname.Target
}
}
return lastCNAME
}
模拟域名服务器8.8.8.8
的dns查询的最佳方法是什么
发布于 2017-06-30 18:25:51
您可以为有问题的func创建一个接口,并在测试中提供一个存根实现:
package main
import (
"fmt"
"github.com/miekg/dns"
)
type LastCnamer interface {
LastCname(domain string) (lastCname string, err error)
}
type LastCnameResolver string
func (l LastCnameResolver) LastCname(domain string) (lastCname string, err error) {
ns := string(l)
c := dns.Client{}
m := dns.Msg{}
m.SetQuestion(domain, dns.TypeA)
r, _, err := c.Exchange(&m, ns)
if err != nil {
return lastCname, err
}
// Last CNAME
for _, ans := range r.Answer {
cname, ok := ans.(*dns.CNAME)
if ok {
lastCname = cname.Target
}
}
return lastCname, nil
}
type LastCnameStub map[string]string
func (m LastCnameStub) LastCname(domain string) (string, error) {
return m[domain], nil
}
func main() {
m := make(map[string]string)
m["www.linkedin.com."] = "pop-tmu1-alpha.www.linkedin.com."
var l LastCnamer = LastCnameStub(m)
cname, _ := l.LastCname("www.linkedin.com.")
fmt.Println("Stub", cname)
l = LastCnameResolver("8.8.8.8:53")
cname, err := l.LastCname("www.linkedin.com.")
if err != nil {
panic(err)
}
fmt.Println("Resolved", cname)
}
或者,您可以配置有问题的DNS,以便在测试中可以交换它并启动本地DNS服务器( github.com/miekg/dns
包中有一个服务器),但这需要更多的代码,包括选择一个随机空闲端口并在测试中使用该端口。
https://stackoverflow.com/questions/44842960
复制相似问题