繁体   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