Go - 测试函数相等

时间:2015-11-14 23:12:54

标签: unit-testing testing go

所以从我读过的内容来看,你无法测试Go中的函数是否相等,但是我试图解决测试用例问题,所以任何帮助重构这个都会很有帮助。

我有一个构造函数,并且我传递了一些配置值。基于这些配置,它将另一个构造函数分配给结构的成员。后来,在另一种方法中,它调用了新的构造函数。我这样做是因为它更容易测试结构上的方法,因为我现在可以创建一个测试构造函数并将struct成员重新分配给它,然后再调用我正在测试的方法。与此处的方法类似:Mock functions in Go

现在,我试图在结构构造函数上编写测试用例,并且我很难弄清楚如何测试它。

以下是一个例子:

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
}

 新的SDNRequest'和' newLegacyRequest'是新的构造函数。我无法弄清楚如何测试newPortFlip方法,以确保它为“构建器”分配正确的方法'会员,因为你无法测试功能平等。

此时我唯一想到的是拥有一个' 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
}

但这似乎相当无聊,所以我认为在我这样做之前我应该​​寻求更好的方法。

思考?

1 个答案:

答案 0 :(得分:0)

使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
}