Testing 如何模拟DNS请求?(千克/域名)
我有一小段代码来解释我要测试的代码库。我跳过了检查错误以使问题简短Testing 如何模拟DNS请求?(千克/域名),testing,go,Testing,Go,我有一小段代码来解释我要测试的代码库。我跳过了检查错误以使问题简短 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)
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
}
模拟dns查询到名称服务器8.8.8.8
的最佳方式是什么
您可以为相关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 IP设置为可配置的,以便在测试中进行交换并启动本地DNS服务器(github.com/miekg/DNS包中有一个服务器),但这将是更多的代码,包括选择一个随机空闲端口并在测试中使用它