我正在尝试让scalaTestPlus在我的播放应用程序中工作(我正在使用Play!2.2)。它运行良好,直到我需要一个来自我的应用程序的功能。例如,如果我运行这个非常简单的测试(通过在sbt控制台中启动“test-only TestName”):
import org.scalatestplus.play._
import org.scalatest._
import Matchers._
class Test extends PlaySpec {
"This test" must {
"run this very simple test without problem" in {
1 mustEqual 1
}
}
}
没有问题,但只要我从我的应用程序调用一个函数,就像在这段代码中一样:
class Test extends PlaySpec {
"This test" must {
"run this very simple test without problem" in {
models.Genre.genresStringToGenresSet(Option("test")) //Here is the problem
1 mustEqual 1
}
}
}
我收到错误:java.lang.ExceptionInInitializerError: at...
Cause: java.lang.RuntimeException: There is no started application
(即使我的应用程序正在运行)。
我可能遗漏了一些简单的东西,因为我对ScalaTest来说是全新的,所以任何有关我做错的帮助都会有所帮助;)
答案 0 :(得分:0)
使用PlaySpec
时,您可能需要在范围内使用应用程序,因为有些操作假设通过Play.current
提供了Play应用程序:
class Test extends PlaySpec {
implicit override lazy val app: FakeApplication = FakeApplication(...)
"This test" must {
"run this very simple test without problem" in {
models.Genre.genresStringToGenresSet(Option("test")) //Here is the problem
1 mustEqual 1
}
}
}
查看functional testing documentation以获取有关FakeApplication
。
但是,我认为您不需要这样做进行模型测试。在游戏的normal ScalaTest docs中,它似乎只是混合在MockitoSugar
中。但是你的方法调用链可能会调用一些需要Application
的 Play 的全局状态,在这种情况下FakeApplication
是要走的路
答案 1 :(得分:0)
正如@akauppi所问,这是一种对我来说非常有效的方法:
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec}
class A extends PlaySpec with OneAppPerSuite {
"a" must {
"return true" in {
//thanks to with OneAppPerSuite, it now works
models.Genre.genresStringToGenresSet(Option("test"))
1 mustBe 1
}
"return false" in {
1 mustBe 2
}
}
}
我只是使用sbt ~testOnly a