簡単な統合テストを実行したいというかなり単純なシナリオがあります。高レベルの概要は次のとおりです。
- という
actor
メッセージに応答する がありますPlaceOrder
publishes
このアクターが を受信したときに別のメッセージを確認したいのですがPlaceOrder
、この場合はOrderPlaced
問題は、統合テストの場合、メッセージが 経由で公開されたと断言できることExpectMsg<OrderPlaced>
です。しかし、そのメッセージを処理するアクターも呼び出すことを期待していましたか?
おそらく、TestKit
ここでの私の理解は間違っていますが、それを継承すると次のようになります。
ActorOfAsTestActorRef<T>
ActorOf<T>
Sys.ActorOf(...)
私の印象は、ActorOf<T>
実際Sys.ActorOf(...)
のアクター システムのように動作するのに対し、ActorOfAsTestActorRef<T>
厳密な単体テストには理想的であり、アクターが送信する可能性のあるメッセージをすべて飲み込むというものでした。
たとえば、これらは問題の 2 つのアクターです。
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 =>
{
});
}
}
私のテストは次のようになります。この統合テストを自分で調整しなければならない奇妙な点は、OrderPlaced
が公開されていることを確認してから、明示的に にメッセージを送信することFoo
です。
[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);
//}
}
}
私が期待しているのは、これが処理するときにPlaceOrder
呼び出すメッセージを送信することです。テストでビットをコメントアウトする必要はありませんか?Foo
OrderPlaced
これを行うことはできますか、それとも私はこれについて完全に間違っていますか?
前もってありがとう、DS。