Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 如何模拟DNS请求?(千克/域名)_Testing_Go - Fatal编程技术网

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包中有一个服务器),但这将是更多的代码,包括选择一个随机空闲端口并在测试中使用它