簡體   English   中英

Golang 網包模擬

[英]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 ,但它不處理接口,所以它可能不是你在找什么)。

這不是您問題的直接答案,但Gomock通過為您提供的任何接口生成代碼來提供模擬 要使用它,您需要使用基於接口的編碼風格,而不是直接依賴於結構體。

因為許多標准庫包都使用接口,所以用 Gomock 模擬它們是有效的。 對於沒有的,您可能需要編寫一個(未經測試的)墊片來提供必要的接口層。 這對我來說似乎沒有傳遞函數指針來實現類似效果的想法那么混亂。

我遇到了同樣的問題,最終使用這個包來模擬: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM