2015-02-09 17 views
5

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 LicenseMangerListLicenses() 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.

cevap

İlgili konular