当我使用scalaTestPlus和Play框架运行测试时,出现错误“没有启动应用程序”

时间:2015-04-28 18:31:32

标签: scala playframework-2.2 scalatest

我正在尝试让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来说是全新的,所以任何有关我做错的帮助都会有所帮助;)

2 个答案:

答案 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

启动测试