Play フレームワークでいくつかの単体テストを設定しようとしています。私のロジックの多くは、バックグラウンドでデータを収集するスケジュールされた akka アクターに組み込まれています。私の問題は、それらを単体テストする方法がわからないことです。私は文字通りそれにアプローチする方法がわかりません。akka-testkit を使おうとしているのですが、基本的にバタバタしています。それにアプローチする方法について何か提案はありますか?例は信じられないほど役に立ちます。これは、私が現在取り組んでいる嫌悪感の例です。
package test
import org.specs2.mutable._
import controllers.Scanner
import java.util.UUID
import org.joda.time.DateTime
import akka.testkit.TestActorRef
import play.api.Logger
import play.api.test.{FakeApplication, TestServer}
import models.PSqlEnum
class ScannerTest extends Specification {
val appId = UUID.randomUUID()
val app = models.App(appId, "TestApp", "TestServer", "TestComponent", "Test Description", DateTime.now(),
DateTime.now(), true, 3, 60, PSqlEnum("scanType", "mandatory"), "http://localhost")
val rules = <Rule name="DivisionDataIsAvailable" elementsToCheck="DivisionDataIsAvailable"
ruleType="is, true, yellow" />
<Rule name="DivisionDataLoadIsHealthy" elementsToCheck="DivisionDataLoadIsHealthy"
ruleType="is, true, red" />;
"Scanner" should {
"test something" in {
val fakeApp = TestServer(3333)
fakeApp.start()
implicit val actorSystem = play.api.libs.concurrent.Akka.system(fakeApp.application)
val scanner = TestActorRef(new Scanner(app, rules)).underlyingActor
Logger.warn(scanner.getResponseFromWebService.toString)
fakeApp.stop()
1 === 1
}
}
}
これは明らかに実際には何もテストしていません。私は基本的に、実行時エラーを停止できるかどうかを確認するために、この時点で 1 === 1 に到達できるようにしようとしています。このコードが生成しているエラーは次のとおりです。
INFO - Starting application default Akka system.
[info] ScannerTest
[info] Scanner should
[info] ! test something
[error] ThrowableException: akka.actor.LocalActorRef.<init>(Lakka/actor/ActorSystemImpl;Lakka/actor/Props;Lakka/actor/InternalActorRef;Lakka/actor/ActorPath;)V (TestActorRef.scala:21)
[error] akka.testkit.TestActorRef.<init>(TestActorRef.scala:21)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:135)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:132)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:125)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:27)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:23)
[error] akka.actor.LocalActorRef.<init>(Lakka/actor/ActorSystemImpl;Lakka/actor/Props;Lakka/actor/InternalActorRef;Lakka/actor/ActorPath;)V
[error] akka.testkit.TestActorRef.<init>(TestActorRef.scala:21)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:135)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:132)
[error] akka.testkit.TestActorRef$.apply(TestActorRef.scala:125)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:27)
[error] test.ScannerTest$$anonfun$1$$anonfun$apply$3.apply(ScannerTest.scala:23)
[info] Total for specification ScannerTest
[info] Finished in 86 ms
[info] 1 example, 0 failure, 1 error
[info] test.ScannerTest
FakeApplication を作成し、その FakeApplication の Akka.system を使用する必要があると思います。しかし、私はそれを行う方法がわかりません。正直なところ、それが正しいアプローチであるかどうかさえわかりません。汎用の Akka.system を生成してそれを機能させることができれば、私は有頂天になるでしょう。誰かがこれに取り組む方法について何かアイデアを持っているなら、私は本当に感謝しています.