所以从我读过的内容来看,你无法测试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
}
但这似乎相当无聊,所以我认为在我这样做之前我应该寻求更好的方法。
思考?
答案 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
}