2016-03-30 31 views
2

Doğrudan ileri bir entegrasyon testi yapmak istediğim oldukça basit bir senaryom var. Ileri düzey incelemesi şöyledir:Akka Net Entegrasyon Testi

  • adında bir iletiye yanıt bir actor var PlaceOrder
  • ben bu durumda, PlaceOrder aldıktan sonra bu aktör publishes başka bir mesaj doğrulamak istediğiniz OrderPlaced

Sorun şu ki, bir bütünleşme testi için iletinin ExpectMsg<OrderPlaced> aracılığıyla yayınlandığını söyleyebilirim. Ama aynı zamanda bu mesajı da işleyen herhangi bir aktörü çağırmasını bekliyordum?

Belki TestKit benim anlayış burada yanlış ama ondan devralan aldığınız:

  • ActorOfAsTestActorRef<T>
  • ActorOf<T>
  • Sys.ActorOf(...) Benim izlenimim oldu ActorOf<T> ve Sys.ActorOf(...) olur

iken gerçek bir aktör sistemi gibi davranınkesinlikle ünite testleri için ideal ve bir aktörün gönderdiği mesajları gönderir.

Örneğin, bu soruya benim 2 aktörler:

public class PlaceOrderActor : ReceiveActor 
{ 
    public PlaceOrderActor() 
    { 
     this.Receive<PlaceOrderMessage>(
      message => 
      { 
       this.Handle(message); 
      }); 
    } 

    private void Handle(PlaceOrderMessage message) 
    { 
     Context.ActorOf(Props.Create<Foo>()).Tell(new OrderPlaced(message.CustomerId, message.OrderItems)); 
    } 
} 

public class Foo : ReceiveActor 
{ 
    public Foo() 
    { 
     this.Receive<OrderPlaced>(
      m => 
      { 
      }); 
    } 
} 

Testim buna benzemez.

I bekliyorum Ne
[TestFixture] 
public class IntegrationTest : TestKit 
{ 
    [Test] 
    public void When_Placing_An_Order() 
    { 
     var message = new PlaceOrderMessage(
      "123", 
      new List<OrderItem> 
      { 
       new OrderItem("Product ABC", 2) 
      }); 

     this.ActorOfAsTestActorRef<PlaceOrderActor>().Tell(message); 

     var orderPlaced = this.ExpectMsg<OrderPlaced>(); 

     //if (orderPlaced != null) 
     //{ 
      //this.ActorOfAsTestActorRef<Foo>().Tell(orderPlaced); 
     //} 
    } 
} 

, bu should mesaj PlaceOrder göndererek: garip şey yani ben OrderPlaced yayımlandı olmadığını kontrol edin ve ardından açıkça Foo bir mesaj göndermek, bu entegrasyon kendimi test sonucu alacak zorunda OrderPlaced'u işlerken Foo'u çağırır. Testte bitlerin yorumlanmasına gerek yok mu?

Bu yapılabilir mi, yoksa bu tamamen yanlış mı yapıyorum?

Şimdiden teşekkürler, DS.

cevap

1

Sizin PlaceOrderActor, FooActor referansınız yok, TestKitleyicisi aktörü olan Sender'a yanıt verir.

FooActor iletisinin OrderPlaced iletisini almasını istiyorsanız, iletiyi PlaceOrderActor.Handle() yönteminizde anlatmanız gerekir. Muhtemelen PlaceOrderActor'un alt öğesi olarak FooActor'u oluşturmanız veya sisteminizde başka bir yerde olması durumunda referansı çözümlemeniz gerekecektir (bu durumda sistemde FooActor çalışanı yoktur). Bu, gerçekte (yani test dışı) sisteminizde nasıl çalışır veya bu sadece şu ana kadar test kodu olarak mevcut mu?

Eğer FooActor için OrderPlaced mesaj göndermek eğer unutmayın ve geri PlaceOrderActor göndereni bir mesajınız söyleme, bu yüzden senin FooActor cevap vermesi gerekir, test yöntemi içinde gözlemlenebilir etki olacaktır doğrudan orijinal göndericiye veya PlaceOrderActor'a geri dönerek orijinal göndericiye yanıt verebilir.

+0

Bu konuda akka net gitter odadaydım ve sanki mesajın yutulmasına neden olan foo oyuncusu yokmuşum gibi görünüyor. Kursuma inanıyorum ki sadece ActorOf Foo'yu eklemem gerekiyor ve işe yaramalı. Haklısın, bunu sadece bir test bakış açısıyla denedim. Konsol uygulamasında bu işe son derece benzer bir şey var. –

+0

Mesajınız beni düşünmemi sağladı, böylece 'Sunucu' mesajlarının göndericisi olarak işlev gören bir 'İstemci' oluşturdum. Bu iyi çalışıyor gibi görünüyor, yani bir 'PlaceOrderActor' tarafından işlenen' PlaceOrderMessage' gönderir. Sonra Context.ActorOf (Props.Create ()) kullanın. (Yeni OrderPlaced (message.CustomerId, message.OrderItems)); '. Ancak, TestKit kullanırken bu mesaj yutulur? –

+0

Doğru olduğundan özür dilerim. Bir çocuk oyuncu yarattı bir tedavi çalıştı. Sadece deneyimlediğim sorun, 'Sys.ActorOf()' (bilgime göre) için ayrı bir iş parçacığı üzerinde çalışan 'ActorOfAsTestActorRef' kullanıyordum ve dolayısıyla ExpectMsg <> 'in iddiası başarısız oldu. Çalışma çözümünü göstermek için gönderiyi güncellemek. –

İlgili konular