簡體   English   中英

Go-測試功能是否相等

[英]Go - testing function equality

因此,從我讀到的內容來看,您無法測試Go中的函數是否相等,但是我正在嘗試解決測試用例的問題,因此任何重構的幫助都會有所幫助。

我有一個構造函數,並向其傳遞了一些配置值。 基於這些配置,它將另一個構造函數分配給該結構的成員。 后來,它以另一種方法調用了該新構造函數。 我這樣做是因為它可以更輕松地測試結構上的方法,因為在調用我正在測試的方法之前,我現在可以創建一個測試構造函數並將struct成員重新分配給它。 與此處的方法類似: Go中的模擬功能

現在,盡管我正在嘗試在struct構造函數上編寫一個測試用例,但我很難確定如何對其進行測試。

這是一個例子:

type requestBuilder func(portFlipArgs, PortFlipConfig) portFlipRequest

type portFlip struct {
    config  PortFlipConfig
    args    portFlipArgs
    builder requestBuilder
}

func newPortFlip(args portFlipArgs, config PortFlipConfig) (*portFlip, error) {
    p := &portFlip{args: args, config: config}
    if p.netType() == "sdn" {
        p.builder = newSDNRequest
    } else if p.netType() == "legacy" {
        p.builder = newLegacyRequest
    } else {
        return nil, fmt.Errorf("Invalid or nil netType: %s", p.netType())
    }
    return p, nil
}

“ newSDNRequest”和“ newLegacyRequest”是新的構造函數。 我無法弄清楚如何測試newPortFlip方法,以確保將正確的方法分配給“ builder”成員,因為您無法測試函數相等性。

此時,我唯一的想法是擁有一個“ builderType字符串”成員,然后將其分配給新構造函數的名稱,然后就可以對其進行測試了。 就像是:

func newPortFlip(args portFlipArgs, config PortFlipConfig) (*portFlip, error) {
    p := &portFlip{args: args, config: config}
    if p.netType() == "sdn" {
        p.builderType = "newSDNRequest"
        p.builder = newSDNRequest
    } else if p.netType() == "legacy" {
        p.builderType = "newLegacyRequest"
        p.builder = newLegacyRequest
    } else {
        return nil, fmt.Errorf("Invalid or nil netType: %s", p.netType())
    }
    return p, nil
}

但這似乎很輕浮,所以我認為在這樣做之前我應該​​尋求一種更好的方法。

有什么想法嗎?

將portFlip設置為接口,並根據傳入的類型讓newPortFlip構造sdnPortFlip或legacyPortFlip。 在測試中,您可以使用類型斷言檢查它是否返回正確的具體類型。

如果將通用類型嵌入到SDN和傳統類型中,則可以直接調用這些方法。

type portFlip interface {
    build()
    ...
}

type portFlipCommon struct {
    config  PortFlipConfig
    args    portFlipArgs
}

type portFlipSdn struct {
    portFlipCommon
}

type portFlipLegacy struct {
    portFlipCommon
}

func (pf *portFlipCommon) netType() { ... }
func (pf *portFlipSdn)    build() { ... }
func (pf *portFlipLegacy) build() { ... }

func newPortFlip(args portFlipArgs, config PortFlipConfig) (portFlip, error) {
    var pf portFlip
    p := &portFlipCommon{args: args, config: config}
    if p.netType() == "sdn" {
        // Either build directly or define build on the sdn type
        pf = &portFlipSdn{*p}
    } else if p.netType() == "legacy" {
        // Either build directly or define build on the legacy type
        pf = &portFlipLegacy{*p}
    } else {
        return nil, fmt.Errorf("Invalid or nil netType: %s", p.netType())
    }
    return pf, nil
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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