VMware vSphere API istemcisi - govmomi - kullanarak bazı kodları test etmek için basit bir alay oluşturmaya çalışıyorum ancak kullanılabilir bir desen bulmakta zorlanıyorum.Üçüncü taraf kitaplıklarıyla alay etmek için golang içinde arabirim kullanımı
istemci kütüphanesi için basit bir kullanım durumu vSphere küme için yüklenen lisansları almak olacaktır:
vclient, err := govmomi.NewClient(*vcurl, true)
if err != nil {
return err
}
lic, err := vclient.LicenseManager().ListLicenses()
NewClient()
bir LicenseManager yapısının bir örneğini döndürür Client.LicenseManager()
bir istemci yapısı, bir işaretçi döndürür ve LicenseManager.ListLicenses()
, lisans bilgilerini içeren yapılardan bir dilim döndürür. Bir Python arka planından geldiğimde, genellikle bir alay için LicenseManger
ListLicenses()
yönteminde maymun ekleyebilirdim, ancak Go'da benzer bir model veya yöntemle gelemiyorum.
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}
}
: Bu noktaya
, Ben isimsiz üyesi ve mocks için mantığı ile sarıcı yapısının yeni örneklerini oluşturmak için bir "kurucu" fonksiyonu
NewVCenter()
olarak govmomi
Client
yapıya sahip bir sarıcı yapı
VCenterClient
oluşturma denedim
... ama govmomi kitaplığındaki iç içe geçmiş yapıları düzgün şekilde soyutlamak için arabirimler kullanarak sorun yaşıyorum. govmomi.LicenseManager()
govmomi.LicenseManager
türünde bir yapı döndürdüğü ve VCenterClientInterface.LicenseManager()
yönteminin LicenseManager
türünde bir arabirim döndürdüğü yukarıdakilerin çalışmayacağını biliyorum. Ancak, bir alternatif bulmaya çalışıyorum.
Bu durumda daha iyi bir tasarım deseni veya uygun arayüz kullanımıyla ilgili herhangi bir yardım çok takdir edilecektir.