2

簡単な統合テストを実行したいというかなり単純なシナリオがあります。高レベルの概要は次のとおりです。

  • という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呼び出すメッセージを送信することです。テストでビットをコメントアウトする必要はありませんか?FooOrderPlaced

これを行うことはできますか、それとも私はこれについて完全に間違っていますか?

前もってありがとう、DS。

4

1 に答える 1

1

には への参照がありませPlaceOrderActorん。テストキット アクターであるFooActorに応答します。Sender

FooActorにメッセージを受信させたい場合OrderPlacedは、メソッドでメッセージを伝える必要がありますPlaceOrderActor.Handle()FooActorの子としてを作成するPlaceOrderActorか、システムの他の場所にある場合はそれへの参照を解決する必要があります (この場合FooActor、システムでまったく実行されていません)。これは実際の (つまり、テストではない) システムでどのように機能しますか? または、これまでのところテスト コードとしてのみ存在しますか?

OrderPlacedメッセージを に送信FooActorし、 の送信者にメッセージを返信しない場合PlaceOrderActor、テスト メソッド内からは目に見える効果がないことに注意してください。そのためFooActor、元の送信者に直接応答するか、またはに戻りPlaceOrderActor、元の送信者に応答できます。

于 2016-03-31T12:31:29.710 に答える