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
varPlaceOrder
- ben bu durumda,
PlaceOrder
aldıktan sonra bu aktörpublishes
başka bir mesaj doğrulamak istediğinizOrderPlaced
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 olduActorOf<T>
veSys.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.
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. –
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? –
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. –