私はまっすぐ前方統合テストをしたいというかなり単純なシナリオを持っています。高レベルの概要、次のとおりです。Akkaネット統合テスト
- 私はこのケースで私は
PlaceOrder
を受信すると、この俳優publishes
に別のメッセージを確認したいPlaceOrder
- と呼ばれるメッセージに応答
actor
、OrderPlaced
持っています問題は、統合テストでは、メッセージがExpectMsg<OrderPlaced>
で公開されていると主張できます。しかし、私はまた、そのメッセージを扱う俳優を呼び出すことを期待していましたか?
おそらくTestKit
の私の理解は、ここで間違っていますが、それを継承したときにあなたが得る:
ActorOfAsTestActorRef<T>
ActorOf<T>
Sys.ActorOf(...)
私の印象は、ActorOf<T>
とSys.ActorOf(...)
なりました実際の俳優システムのように振る舞いますが、厳密な単体テストには理想的であり、俳優が送るメッセージを飲み込むことができます。私のテストはこのようになります
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 =>
{
});
}
}
:たとえば、これらは、問題の私の2人の役者
です。私は、この統合テストを自分自身を編成する必要が奇妙なこと、つまり私は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
を送信することにより、 OrderPlaced
を処理するので、Foo
を呼び出します。私はそのビットをテストでコメントアウトする必要はありませんか?
これを行うことができますか、これについて完全に間違っていますか?
ありがとうございます、DS。
私はこれについてakka net gitter roomにいたので、foo actorが動作していないように見えて、メッセージが飲み込まれているようです。私は自分のセットアップで、ActorOf Fooを追加するだけで動作すると信じています。あなたは正しいです。私はテストの観点からこれを試しただけです。私はコンソールアプリケーションでこれと非常によく似た何かを実行しています。 –
私は思ったようにポストしていますので、単に 'Server'へのメッセージの送信者として機能する' Client'を作成しました。これは正常に動作するようです。すなわち、 'PlaceOrderActor'によって処理される' PlaceOrderMessage'を送信します。次に、 'Context.ActorOf(Props.Create())を使います。(新しいOrderPlaced(message.CustomerId、message.OrderItems)))'を教えてください。しかし、TestKitを使用するとき、このメッセージは飲み込まれますか? –
あなたが正しいとお詫び申し上げます。子供の俳優を作成し、治療を働いた。私が直面していた問題は、(私の知る限り) 'Sys.ActorOf()'とは別のスレッドで実行される 'ActorOfAsTestActorRef'を使用していて、' ExpectMsg <> 'のアサートが失敗していたことが起こっていました。作業用のソリューションを表示するためにポストを更新してください。 –