unit-testing - Go - 测试函数相等性

标签 unit-testing testing go

因此,根据我的阅读,您无法在 Go 中测试函数是否相等,但我正在尝试解决测试用例问题,因此重构此问题的任何帮助都会有所帮助。

我有一个构造函数,我正在向它传递一些配置值。基于这些配置,它将另一个构造函数分配给结构的成员。后来,在不同的方法中,它调用了那个新的构造函数。我这样做是因为它使测试结构上的方法变得更容易,因为我现在可以创建一个测试构造函数并将结构成员重新分配给它,然后再调用我正在测试的方法。类似于此处的方法: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
}

“newSDNRequest”和“newLegacyRequest”是新的构造函数。我无法弄清楚如何测试 newPortFlip 方法以确保它将正确的方法分配给“builder”成员,因为您无法测试函数相等性。

此时我唯一的想法是拥有一个“builderType string”成员,并将其分配给新构造函数的名称,然后我就可以对其进行测试。像这样的东西:

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 成为接口(interface),并让 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
}

关于unit-testing - Go - 测试函数相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714478/

相关文章:

c# - 局部变量和从方法调用的变量之间的区别? C#

api - 数据可视化API

reactjs - 使用 URL 对象进行 Jest 测试

go modules 多个主要方法

Go 中的日期解析

performance - 不要完全使用 cpu

Android Eclipse 插件 : Instrumentation Test Runner not specified

java - 获取 JUnit 4 中当前正在执行的测试的名称

java - 如何让 EasyMock 模拟多次返回一个空列表

c# - 如何对预期编译失败的 C# 代码进行单元测试以进行负面测试?