我正在尝试创建一个简单的模拟,用于使用VMware vSphere API客户端- govmomi -对一些代码进行单元测试,但我在寻找可用的模式时遇到了麻烦。
客户端库的一个简单使用案例是检索vSphere群集的已安装许可证:
vclient, err := govmomi.NewClient(*vcurl, true)
if err != nil {
return err
}
lic, err := vclient.LicenseManager().ListLicenses()NewClient()返回一个指向客户端结构的指针,Client.LicenseManager()返回一个LicenseManager结构的实例,LicenseManager.ListLicenses()返回一个包含许可信息的结构片段。出于Python背景,我通常会在LicenseManger上随意修补ListLicenses()方法,但我似乎无法在Go中提出类似的模式或方法。
到目前为止,我已经尝试创建了一个包装器结构VCenterClient,将govmomi Client结构作为匿名成员,并使用“构造函数”函数NewVCenter()来创建具有模拟逻辑的包装器结构的新实例:
import (
"net/url"
"github.com/vmware/govmomi"
"github.com/vmware/govmomi/vim25/types"
)
type VCenterClient struct {
VCenterClientInterface
}
type VCenterClientInterface interface {
LicenseManager() LicenseManager
}
type LicenseManager interface {
ListLicenses() ([]types.LicenseManagerLicenseInfo, error)
}
type VCenterClientMock struct{}
type LicenseManagerMock struct{}
func (v *VCenterClientMock) LicenseManager() LicenseManager {
return LicenseManagerMock{}
}
func (l LicenseManagerMock) ListLicenses() ([]types.LicenseManagerLicenseInfo, error) {
return make([]types.LicenseManagerLicenseInfo, 0), nil
}
func NewVCenterClient(uri string, mock bool) *VCenterClient {
if mock {
return &VCenterClient{&VCenterClientMock{}}
}
vcurl, _ := url.Parse(uri)
vclient, _ := govmomi.NewClient(*vcurl, true)
return &VCenterClient{vclient}
}...but我在使用接口正确抽象govmomi库中的嵌套结构时遇到了问题。我知道上面的方法不起作用,因为govmomi.LicenseManager()返回类型为govmomi.LicenseManager的结构,而我的VCenterClientInterface.LicenseManager()方法返回类型为LicenseManager的接口。然而,我正在努力寻找替代方案。
在这种情况下,任何关于更好的设计模式或接口的正确使用的帮助都将不胜感激。
发布于 2015-02-10 04:34:08
这个库是一个SOAP客户端(http://godoc.org/github.com/vmware/govmomi/vim25/soap#Client)。使用net/ HTTP /httptest (http://golang.org/pkg/net/http/httptest/)在HTTP层进行抽象,或者使用您自己的HTTPRoundtripper模拟响应。
https://stackoverflow.com/questions/28418430
复制相似问题