2015-11-15 8 views
16

Güvenilir Servis/Aktör'ü sadece yapıcıyı arayarak ve sonra da yöntemlerini test ederek test edemiyorum. var testService = new SomeService();, bir NullReferenceException atar. Öyleyse dağıtılmış hizmet ile ne yapabilirim?Servis Kumaş Birimi Test Etme ve Bağımlılık Enjeksiyonu

Bu konuşulan SF Güvenilir Hizmetler/Aktörler standart .NET sınıfları ve konuşlandırılmış S/A'nın birim testi belki de garip bir fikir olmadığını anlıyorum. Her neyse şimdi denemeye çalışıyorum. Örneğin,

. Bir Hizmet kurdum, testte bir Proxy nesnesi oluşturdum ve Hizmet giriş sırasına öğe ekledim. Sonra giriş sırası sayısı = 1 olduğunu iddia etmeliyim. Ve eğer bir Hizmet dağıtmış olsaydım ve diğer İstemciler/Hizmetler/Aktörler giriş kuyruğunu kullanmadıysa çalışır. Ama bir dahaki sefere bu test başarısız olacak, sorun bu. Hizmetin diğer tüketicilerle çalışmayı bırakmasını, kuyruğunu bırakmasını ve test etmesini sağlaması gerekiyor. Bu amaçla, bazı TestMode özelliklerini ve PropareoForTests/TestingCompleted gibi bazı yöntemleri oluşturabilir ve test öncesi ve sonrası bunları test istemcisinden arayabilirim.

Bunun böyle yapmak kötü bir fikirdir. Belki SF testi için bazı kurallar var mı? Teşekkürler.

GÜNCELLEME:

Bu YAPILACAK dize buldum Service Fabric Web Reference Application example araştırırken:

/// TODO: Temporary property-injection for an IServiceProxyWrapper until constructor injection is available. 

o SF Hizmetleri DI desteği bu kadar artıracağını ifade ediyor mu? Oyunculara ne dersin?

+3

Oluşturucu bağımlılığı enjeksiyonu aslında aktörlerde şu anda hazır! Aktör türünüzü kaydettiğinizde, aslında aktör sınıfının örneğinizi kontrol edebilmeniz için Actor sınıf örneğini oluşturduğunuz bir Func <> olan bir "fabrika" da kaydedebilirsiniz, böylece oradan bağımlılıkları enjekte edebilirsiniz. Hizmetlerde bunu zaten yapabilirsiniz, Parti Kümesi örneğinde nasıl yaptığımızı kontrol edin: https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster/tree/master/PartyCluster/ ClusterService –

+1

Birlik ile bağımlılık enjeksiyon yapmaya bir cevap yazdım: http://stackoverflow.com/questions/30384780/azure-service-fabric-actor-dependency-injection/35900027#35900027 –

+0

@VaclavTurecek Linkiniz bozuk – Dismissile

cevap

16

Aslında Güvenilir Hizmetleri ve Aktörleri, .NET'teki başka bir sınıfı sınadığınız şekilde de test edebilirsiniz! Bunlar, yalnızca belirli platformları temel platformda kullanmaları bakımından özeldir, ancak bunun dışında hizmet veya oyuncu sınıfınızı normal bir şekilde başlatabilir ve yöntemlerini çağırabilirsiniz.

Şu anda, Güvenilir Hizmetler, platformdaki birincil kanca, State Manager, kurucu aracılığıyla takılabilen bir arabirim olduğundan, birim sınaması biraz daha kolaydır.

Örneğin, hizmet sınıfı aşağıdaki gibi görünebilir:

EDIT: GA bırakma API ile Güncelleme (2.0.135)

class MyService : StatefulService 
{ 
    public MyService (StatefulServiceContext context, IReliableStateManager stateManager) 
     :base (context, stateManager) 
    { 
    } 

    public void MyMethod() 
    { 
    // do stuff.. 
    } 
} 

Sonra şöyle servis sınıfını test edebilirsiniz:

[TestMethod] 
public TestMyMethod() 
{ 
    MockReliableStateManager stateManager = new MockReliableStateManager(); 
    MyService target = new MyService(stateManager); 

    target.MyMethod(); 
    // validate results and all that good stuff 
} 

Biz GitHub'dan geçerli test ünitesi olmak bağımlılıkları dolu fiili hizmetlerin tam çalışma örneği vardır: https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster

Bu örnek, kendi birim testleriniz için başlangıç ​​noktası olarak kullanabileceğiniz IReliableStateManager ve IReliableDictionary alaylarına sahiptir.

+0

Teşekkürler, Vaclav! Tam olarak ihtiyaç duyulan şey bu. Lütfen güncellemeye göz atın. – AsValeO

+1

RTM'de (Actors 2.0.135), "Actor.StateManager" özelliği salt okunurdur (korunan ayar yok). Oyuncu sınıfım için devlet yöneticisi bağımlılığını nasıl enjekte etmeliyim? –

+0

Peki ya oyuncular için hatırlatıcılar ve zamanlayıcılar? 'ReceiveReminderAsync' yöntemini kendim çağırabilirim, ancak 'RegisterReminderAsync' (" ActorBase "üzerinde korumalı yöntem) için yapılan aramaları doğrulamam gerekiyor. –

4

Güvenilir Aktörler devlet yöneticisi alay için, böyle bir şey yapabilirsiniz:

private readonly IActorStateManager _stateManager; 

public MyActor(IActorStateManager stateManager = null) 
{ 
    _stateManager = stateManager ?? this.StateManager; 
} 

Aslında StateManager henüz şu anda başlatılmadı. OnActivateAsync çağrıldığında Biz alabilirsiniz:

private IActorStateManager _stateManager; 

// Unit tests can inject mock here. 
public MyActor(IActorStateManager stateManager = null) 
{ 
    _stateManager = stateManager; 
} 

protected override async Task OnActivateAsync() 
{ 
    if (_stateManager == null) 
    { 
     _stateManager = StateManager; 
    } 
} 

Sadece her zaman kodunun geri kalanı yerine this.StateManager yılında _stateManager kullandığınızdan emin olun.