問題タブ [akka-testkit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
498 参照

scala - Akka Actor isTerminated 非推奨

特定の条件下でアクターがシャットダウンすることを確認する単体テストを作成するだけなので、次のようなテストがあります。

isTerminatedが非推奨であるという警告を受け取りました。ヒントでは、 context.watch()を使用することをお勧めしますが、単体テストでは、監視する親アクターまたはコンテキストがありません。

tddTestActor のシャットダウンを検証する最良の方法は何でしょうか?

0 投票する
1 に答える
388 参照

scala - 完全なアクター システムをテストするためのスプレー、Akka、Scala のアプローチ

スプレー、Akka、および Scala を利用したアプリケーションがあります。現在の単体テストは Scala Test を介して行われています。アプリケーションは、Spray ルーティングを使用して Web リクエストの基本的なデータを特定および解析し、それをアクターに渡して必要なアクションを実行させます。スプレーでは、各アクターを構成および開始する、spray.servlet.Initializer から継承するカスタム初期化クラスを使用します。これらのアクションの一部は、7 つまたは 8 つの他の Web サービスを呼び出すことです。それぞれに、それぞれのサービスとの通信を処理するアクターがあります。そのため、通信を他のアクターに委譲するメイン アクターで一連のロジックを実行し、最後に自身の作業に加えて、返されたすべてのデータを処理します。

Scala Test と Akka Testkit を使用してシステム全体をテストし、Testkit を使用して、通信アクターを置き換えて適切なテスト データを返したいと考えています。

質問は 2 つの部分です。

  • テストへのより良いアプローチは何ですか? Scala Testkit を使用して、Spray Testkit 経由で Spray ルーティング サービスを介してリクエストを作成できます。別の方法は、メイン アクターがケース クラスを介してルーティング サービスの結果を取得するため、ルーティング サービスをスキップして、そのアクターにメッセージを直接渡すことです。どちらにもメリットがあります。ただし、Spray テストキットに関するドキュメントはほとんどありません。Spray.servlet.Initializer にアクターの初期化ロジックがある場合、Akka Testkit を介してアクターをどのようにサブスクライブしますか?

  • 2 つ目は、Akka Testkit を介してより複雑なアクター システムをセットアップする方法です。ドキュメントにはこれが可能であると記載されていますが、それを行う方法を正確に表現することはできません。ビジネスロジックの大部分である別のアクターと通信するアクターであるルーティングサービスがありますが、その後、他のいくつかのアクターと通信します。これらの通信アクターは、Akka Testkit のドキュメントに関して「子」アクターと見なされますか? リッチ Akka アクター システム全体をテストする際のベスト プラクティスを示すプロジェクトはありますか?

この場合の私の本能は、ルーティング システムをテストするために、スプレー テストキット ベースの一連のテストを用意することです。次に、データ ケース クラスをマスター アクターに送信し、その背後にモック化された通信アクターを配置して、マスター アクターから正しい応答が返されることを確認する一連のテストを行います。

0 投票する
1 に答える
145 参照

scala - akka アクターが順序を保証せずに一連の異なるタイプのメッセージを受信することをテストする

TL;DR:

メッセージの順序を保証せずに、Akka アクターがさまざまな種類のメッセージのセットを受信することをテストする方法がわかりません。

仕様:

一部のドメイン イベントが に公開されることをテストしていますakka.event.EventStreamTestProbeそうするために、すべてのDomainEventサブクラスにa をサブスクライブしました。

このようにして、他の可能性のあるイベントを考慮せずに、単一のドメイン イベントが に到着することをテストできます (脆弱なテストは避けてください)。EventStream

仕様:

ヘルパー特性:

また、他の可能なイベントを考慮せずに順序を保証する同じタイプのイベントのセットを受け取る必要があるシナリオのテストもあります (脆弱なテストは避けてください)。

仕様:

ヘルパー特性:

問題は、さまざまなタイプの一連のイベントを公開しており、順序が保証されていないことをテストする必要があるユース ケースにあります。

私が解決する方法がわからない問題は、このshouldPublishDomainEventsOfType場合、EventTypeこの非常に特定のタイプに関連する特定のアサーションをeventAsserter: EventType => Unit. しかし、私はさまざまな特定のタイプのイベントを持っているため、それらのタイプなどを指定する方法がわかりません。

アサーション関数を含むケース クラスに基づくアプローチを試みましたが、問題は同じで、少し行き詰まっています。

ありがとう!

0 投票する
1 に答える
43 参照

akka - akka testkit で、通常のメソッドではなくイベントを使用してアクターの状態を取得するのはなぜですか?

俳優の章のakka の本で3。メッセージ イベントを使用して、サイレント アクターの状態をテストします。

アクターは次のとおりです。

次のようにコードをテストします。

テスト コード内で、GetState を使用して上記のSilentMessageイベントの結果を取得する理由。結果をまっすぐに取得し
ないのはなぜですか?slientActor.internalState

アップデート

一部の友人は私の問題を誤解しているようです. 詳細については, 本は言った

変数を使用internalStateすると同時実行性の問題が発生するため、直接GetState使用するのではなく、アクターの内部状態を取得するためにイベント テル アクターを使用する必要があります。internalState

GetState同時実行の問題が発生する理由と、使用によって問題を解決できる理由がわかりません

説明

slientActor.internalState内部変数をそのまま取得することはできません。インスタンスを使用silentActor.underlyingActor.internalStateすると取得できます。ひどい質問で申し訳ありません。

0 投票する
1 に答える
663 参照

scala - Akkaで子役をからかう

アクターの単体テストを作成しようとしていますが、基本的なモックに固執しています。PriceAggregateActor は akka の永続性を使用しており、すべての conf を渡したくなく、完全にモックしたいと考えています。

これは私がテストしたい俳優です

だから私のテストでは、次のようなことをしようとしています:

私はいつも得ています:

なぜそれはmockedChildについて不平を言っているのですか? コンストラクター引数を取らないでください。

0 投票する
1 に答える
45 参照

scala - 失敗した場合にアクターの動作を適切にテストする方法

特定のアクターが失敗した場合にシステムがどのように動作するかを知ることは非常に重要です。たとえば、リカバリがどのように実行されるか、スナップショットが適切にフェッチされるかなどです。驚いたことに、ドキュメントにはアドバイスが見つかりませんでした。

いくつかの例で見たアプローチは、特別なFailメッセージを用意し、アクターExceptionがこのメッセージに対して をスローできるようにすることです。

プロダクションコードとテストコードが混在していて、疑いを持たない読者に合理的なWTFが生成される可能性があるため、決して使用しないことを願っています.

任意のアクターを適切に失敗させるにはどうすればよいですか?

ありがとうございました

0 投票する
1 に答える
3129 参照

scala - Akka アクター テスト: TestProbe による自動応答

メッセージを受信するたびに、確認応答を返すようにテスト プローブを取得しようとしています。

テストで次のコードを書きましたが、機能しません。

それを行う方法はありますか。テスト プローブに実際にメッセージを送信しているアクターは、間違いなく TestThread とは別のスレッドで実行されています。以下に、現在作成されている完全なテストを示します。

}

changeSetActor は完全にテストされ、動作します。テストは ChangeWriter でハングします。receive メソッドでメッセージを受信することはありません。

EDIT1(@Jakko anserをフォロー)

オートパイロットは次のとおりです。

これまでの説明はすべて明確ですが、公式の例で紛らわしいのは「testActor」への参照です。ここで testActor とは誰ですか? その時点でその名前の変数宣言はありません。