当我 运行 使用 scalaTestPlus 和 Play 框架进行测试时,出现错误 "no started application"
When I run tests with scalaTestPlus and Play framework, I get an error "no started application"
我正在尝试让 scalaTestPlus 在我的 play 应用程序中工作(我正在使用 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
(即使我的应用程序是 运行ning)。
我可能遗漏了一些简单的东西,因为我是 ScalaTest 的新手,所以任何关于我做错事的帮助都会被感激;)
使用 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
。但是您的方法调用链可能会调用 Play 的某些全局状态,这确实需要 Application
,在这种情况下,FakeApplication
是要走的路
正如@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
启动测试
我正在尝试让 scalaTestPlus 在我的 play 应用程序中工作(我正在使用 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
(即使我的应用程序是 运行ning)。
我可能遗漏了一些简单的东西,因为我是 ScalaTest 的新手,所以任何关于我做错事的帮助都会被感激;)
使用 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
。但是您的方法调用链可能会调用 Play 的某些全局状态,这确实需要 Application
,在这种情况下,FakeApplication
是要走的路
正如@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