作者:shadow | 来源:互联网 | 2023-05-22 18:04
我正在尝试创建一个简单的模拟器,用于使用VMware vSphere API客户端 - govmomi对单个代码进行单元测试- 但是我无法找到可用的模式.
客户端库的一个简单用例是检索vSphere集群的已安装许可证:
vclient, err := govmomi.NewClient(*vcurl, true)
if err != nil {
return err
}
lic, err := vclient.LicenseManager().ListLicenses()
NewClient()
返回指向Client结构的指针,Client.LicenseManager()
返回LicenseManager结构的实例,并LicenseManager.ListLicenses()
返回包含许可证信息的结构片段.来自Python的背景,我通常会ListLicenses()
在LicenseManger
模拟方法上修补方法,但我似乎无法在Go中提出类似的模式或方法.
到目前为止,我已经尝试VCenterClient
使用govmomi Client
结构创建一个包装器结构作为匿名成员和一个"构造函数"函数NewVCenter()
来创建包含mocks逻辑的包装器结构的新实例:
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}
}
...但我无法使用接口来正确抽象govmomi库中的嵌套结构.我知道上面的内容不起作为govmomi.LicenseManager()
返回类型的结构,govmomi.LicenseManager
我的VCenterClientInterface.LicenseManager()
方法返回一个类型的接口LicenseManager
.但是,我正在努力寻找替代方案.
在这种情况下,任何有关更好的设计模式或正确使用接口的帮助都将非常受欢迎.