当我 运行 使用 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

启动测试