問題タブ [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.
scala - Akka Actor isTerminated 非推奨
特定の条件下でアクターがシャットダウンすることを確認する単体テストを作成するだけなので、次のようなテストがあります。
isTerminatedが非推奨であるという警告を受け取りました。ヒントでは、 context.watch()を使用することをお勧めしますが、単体テストでは、監視する親アクターまたはコンテキストがありません。
tddTestActor のシャットダウンを検証する最良の方法は何でしょうか?
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 アクター システム全体をテストする際のベスト プラクティスを示すプロジェクトはありますか?
この場合の私の本能は、ルーティング システムをテストするために、スプレー テストキット ベースの一連のテストを用意することです。次に、データ ケース クラスをマスター アクターに送信し、その背後にモック化された通信アクターを配置して、マスター アクターから正しい応答が返されることを確認する一連のテストを行います。
scala - akka アクターが順序を保証せずに一連の異なるタイプのメッセージを受信することをテストする
TL;DR:
メッセージの順序を保証せずに、Akka アクターがさまざまな種類のメッセージのセットを受信することをテストする方法がわかりません。
仕様:
一部のドメイン イベントが に公開されることをテストしていますakka.event.EventStream
。TestProbe
そうするために、すべてのDomainEvent
サブクラスにa をサブスクライブしました。
このようにして、他の可能性のあるイベントを考慮せずに、単一のドメイン イベントが に到着することをテストできます (脆弱なテストは避けてください)。EventStream
仕様:
ヘルパー特性:
また、他の可能なイベントを考慮せずに順序を保証する同じタイプのイベントのセットを受け取る必要があるシナリオのテストもあります (脆弱なテストは避けてください)。
仕様:
ヘルパー特性:
問題は、さまざまなタイプの一連のイベントを公開しており、順序が保証されていないことをテストする必要があるユース ケースにあります。
私が解決する方法がわからない問題は、このshouldPublishDomainEventsOfType
場合、EventType
この非常に特定のタイプに関連する特定のアサーションをeventAsserter: EventType => Unit
. しかし、私はさまざまな特定のタイプのイベントを持っているため、それらのタイプなどを指定する方法がわかりません。
アサーション関数を含むケース クラスに基づくアプローチを試みましたが、問題は同じで、少し行き詰まっています。
ありがとう!
akka - akka testkit で、通常のメソッドではなくイベントを使用してアクターの状態を取得するのはなぜですか?
俳優の章のakka の本で3。メッセージ イベントを使用して、サイレント アクターの状態をテストします。
アクターは次のとおりです。
次のようにコードをテストします。
テスト コード内で、GetState を使用して上記のSilentMessage
イベントの結果を取得する理由。結果をまっすぐに取得し
ないのはなぜですか?slientActor.internalState
アップデート
一部の友人は私の問題を誤解しているようです. 詳細については, 本は言った
変数を使用
internalState
すると同時実行性の問題が発生するため、直接GetState
使用するのではなく、アクターの内部状態を取得するためにイベント テル アクターを使用する必要があります。internalState
GetState
同時実行の問題が発生する理由と、使用によって問題を解決できる理由がわかりません
説明
slientActor.internalState
内部変数をそのまま取得することはできません。インスタンスを使用silentActor.underlyingActor.internalState
すると取得できます。ひどい質問で申し訳ありません。
scala - Akkaで子役をからかう
アクターの単体テストを作成しようとしていますが、基本的なモックに固執しています。PriceAggregateActor は akka の永続性を使用しており、すべての conf を渡したくなく、完全にモックしたいと考えています。
これは私がテストしたい俳優です
だから私のテストでは、次のようなことをしようとしています:
私はいつも得ています:
なぜそれはmockedChildについて不平を言っているのですか? コンストラクター引数を取らないでください。
scala - 失敗した場合にアクターの動作を適切にテストする方法
特定のアクターが失敗した場合にシステムがどのように動作するかを知ることは非常に重要です。たとえば、リカバリがどのように実行されるか、スナップショットが適切にフェッチされるかなどです。驚いたことに、ドキュメントにはアドバイスが見つかりませんでした。
いくつかの例で見たアプローチは、特別なFail
メッセージを用意し、アクターException
がこのメッセージに対して をスローできるようにすることです。
プロダクションコードとテストコードが混在していて、疑いを持たない読者に合理的なWTFが生成される可能性があるため、決して使用しないことを願っています.
任意のアクターを適切に失敗させるにはどうすればよいですか?
ありがとうございました
scala - Akka アクター テスト: TestProbe による自動応答
メッセージを受信するたびに、確認応答を返すようにテスト プローブを取得しようとしています。
テストで次のコードを書きましたが、機能しません。
それを行う方法はありますか。テスト プローブに実際にメッセージを送信しているアクターは、間違いなく TestThread とは別のスレッドで実行されています。以下に、現在作成されている完全なテストを示します。
}
changeSetActor は完全にテストされ、動作します。テストは ChangeWriter でハングします。receive メソッドでメッセージを受信することはありません。
EDIT1(@Jakko anserをフォロー)
オートパイロットは次のとおりです。
これまでの説明はすべて明確ですが、公式の例で紛らわしいのは「testActor」への参照です。ここで testActor とは誰ですか? その時点でその名前の変数宣言はありません。