9

私はScalaにかなり慣れていないので、優しくしてください。

私が現在構築しているアプリでは、Akka アクターを使用しており、いくつかの単体テストを作成したいと考えています。Akka アクターの単体テストを作成するためのこの公式ドキュメントに出会いました

しかし、それがどのように機能するかを正確に理解できませんでした。特に、

val actorRef = TestActorRef(new MyActor)
// hypothetical message stimulating a '42' answer
val future = actorRef ? Say42
val Success(result: Int) = future.value.get
result must be(42)

それを試してみると、not found: value Success驚くべきことではありません。

次に、Scala アクターをテストする方法の例を見つけました

val actorRef = TestActorRef[TickTock]

implicit val timeout = Timeout(5 seconds)
val future = (actorRef ? new Tick("msg")).mapTo[String]
val result = Await.result(future, timeout.duration)

Assert.assertEquals("processed the tick message", result)

、確かに古いかもしれませんが、理解しやすく、Futures を使用したいときに通常使用するものに近く、最も重要なことは動作します。ActorSystem、タイムアウトなどのいくつかの暗黙を宣言する必要がありますが、公式の方法ではそうではないようです...

可能であれば、公式ドキュメントで提案されている方法を使用したいので、誰かがそれがどのように機能するか(特にSuccess bit)とその使用方法を理解するのを手伝ってくれるとありがたい.

4

3 に答える 3

13

あなたの質問への回答は長すぎるかもしれません。なぜなら、あなたが実際にどれだけ Scala を知っているかを知ることは不可能だからです。回答はできるだけ短くするように努めますが、いつでも明確な説明を求めることを躊躇しないでください。また、スタックオーバーフロー コミュニティ全体を代表して、質問をする前に明らかにスキルが不足しているため、謝罪する必要があると感じさせたことをお詫びします。

Scala 2.10 では、 の概念Tryが導入されました。によく似ていOptionます。Optionsの取り扱いの概念ですnull。type の値は、またはOptionの 2 つの形式を取ることができます。al 値がある場合は、パターン マッチして、それが aまたは aであるかどうかを確認し、それに応じて処理できます。パターン マッチングは Scala の多くの場所で発生し、そのうちの 1 つはs の初期化中に発生します。以下にいくつかの例を示します。Some(value)NoneOptionSomeNoneval

val x = 10 // pattern 'x' on the LHS matches any value on the RHS so 'x' is initialized with 10
val Some(x) = Some(10) // pattern 'Some(x)' on the LHS matches any value of type 'Some' and binds it's value to x, so 'x' is yet again initialized with 10

Try例外処理の概念です。type の値は、またはTryの 2 つの形式を取ることができます。type の値がある場合、それをパターン マッチして、それが aまたは aであるかどうかを確認できます。Success(result)Failure(throwable)TrySuccessFailure

これがコードで発生することです ( でのパターン マッチングSuccess)。Optionの 2 つの形式とは対照的に、Try既定ではスコープ内にないため、コンパイル エラーが発生します。これで修正されます:

import scala.util.{Try, Success, Failure}
于 2013-05-28T09:26:11.117 に答える
5

テストで TestKit を拡張し、「with ImplicitSender」を追加すると、次のようなことができます。

val yourActor = system.actorOf(Props[MyActor])
yourActor ! Say42
expectMsg(42)
于 2013-05-28T09:30:46.293 に答える
4

まず、get on futures value を使用するのは適切なパターンではありません。これは、失敗があった場合に例外を発生させる可能性があります。秒の例のように Await.result を使用するか、パターン マッチングを使用して成功と失敗を処理する必要があります。

future match {
  case Success(value) => // work with value
  case Failure(ex) => // work with exception
}

使用SuccessしてFailureインポートscala.util._するか、scala.util.{Success, Failure}

これは、最新リリース 2.2-M3 の公式ドキュメントです

于 2013-05-28T09:28:00.710 に答える