【发布时间】:2013-10-02 23:08:39
【问题描述】:
我正在尝试使用 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 并完成这项工作,我会欣喜若狂。如果有人对如何解决这个问题有任何想法,我将不胜感激。
【问题讨论】:
-
抱歉听起来像个推销员,但 Manning 的
Akka in Action有一章是关于 Akka 测试的。我读过这本书,但还没有读完。 -
是的,我一直在阅读有关 Akka 测试的信息。我遇到的问题与 Play 的关系比我认为的 Akka 更多。我无法让单个示例起作用,而且 Play 的文档似乎不是最新的。我真的需要一个如何在 Play 2.2 中执行此操作的示例。
-
我在 Akka in Action 中看到的示例具有扩展
TestKit(ActorSystem("testsystem"))的测试类,他们还使用override protected def afterAll() { super.afterAll(); system.shutdown(); }创建了一个 trait 并将其混合。为此,他们必须注释this: TestKit with Suite =>。也许这会有所帮助。 -
好的,我去看看。无论如何,我可能需要花费 40 美元。作为记录,I found a way 专门为单元测试创建一个 DefaultApplication。
val application = new DefaultApplication(new File("."), this.getClass.getClassLoader, None, Mode.Dev); implicit val actorSystem = play.api.libs.concurrent.Akka.system(application)早上我会用头撞它,如果我弄清楚了,我会发布它。感谢您的建议。 -
我买了它,不幸的是,它们根本不包括单元测试。我将切换到 scalaTest,看看我是否可以使用它。如果我想出一个解决方案,我会发布一个解决方案。再次感谢。
标签: unit-testing scala playframework-2.2