В тестах Play 2.2, Spec2 я получаю сообщение об ошибке конфигурации [Не удается подключиться к базе данных [по умолчанию]]

Я использую Scala Spec2 в приложении Play Framework версии 2.2. Когда я запускаю тесты, я получаю следующие ошибки:

$ test-only ApplicationSpec
Mode is Test, Loading: application.test.conf
Create schema
Populate the application schema...
Stopping the application...
Stopping the application...
Stopping the application...
[info] ApplicationSpec
[info] Application should
[info] + send 404 on a bad request
[info] ! render the login page
[error]     anon$1: Configuration error[Cannot connect to database [default]] (Configuration.scala:92)
[error] play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:92)
[error] play.api.Configuration.reportError(Configuration.scala:570)
[error] play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252)
[error] play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:243)
[error] play.api.db.BoneCPPlugin.onStart(DB.scala:243)
[error] play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88)
[error] play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88)
[error] play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:88)
[error] play.api.Play$$anonfun$start$1.apply(Play.scala:88)
[error] play.api.Play$$anonfun$start$1.apply(Play.scala:88)
[error] play.utils.Threads$.withContextClassLoader(Threads.scala:18)
[error] play.api.Play$.start(Play.scala:87)
[error] play.api.test.PlayRunners$class.running(Helpers.scala:44)
[error] play.api.test.Helpers$.running(Helpers.scala:364)
[error] ApplicationSpec$$anonfun$1$$anonfun$apply$12.apply(ApplicationSpec.scala:25)
[error] ApplicationSpec$$anonfun$1$$anonfun$apply$12.apply(ApplicationSpec.scala:25)

MockGlobal.scala содержит следующий код:

object MockGlobal extends GlobalSettings {

  override def onStart(app: Application) {
    super.onStart(app)
    // check if the database is already setup
    implicit val a = app

    if (isDatabaseEmpty(app)) {
      println("Create schema")
      FixtureUtils.populateSchema
      println("Pouplate fixtures ")
      FixtureUtils.GoldData.populateFixtures
    }
  }

  def isDatabaseEmpty(app: Application) = {

    implicit val a = app

    DB.withSession { implicit session =>
      val lst = MTable.getTables("users").list()
      lst.isEmpty
    }
  }

  override def onLoadConfig(config: Configuration,
    path: File, classloader: ClassLoader,
    mode: Mode.Mode): Configuration = {

    val configfile = s"application.${mode.toString.toLowerCase}.conf"
    println(s"Mode is ${mode.toString}, Loading: ${configfile}")
    val modeSpecificConfig = config ++ Configuration(
      ConfigFactory.load(configfile))
    super.onLoadConfig(modeSpecificConfig, path, classloader, mode)
  }

  override def onStop(app: Application) {
    println("Stopping the application...")
  }
}

TestApplication.scala содержит следующий код:

object TestApplication {
  val log = play.Logger.of("application")
  lazy val app = FakeApplication(withGlobal = Some(MockGlobal))
}

ApplicationSpec.scala содержит следующий код:

import org.specs2.mutable._
import org.specs2.runner._
import org.junit.runner._
import play.api.test._
import play.api.test.Helpers._
import models.User
import models.Users
import fixtures.TestApplication
import fixtures.FixtureUtils

/**
 * Add your spec here.
 * You can mock out a whole application including requests, plugins etc.
 * For more information, consult the wiki.
 */
@RunWith(classOf[JUnitRunner])
class ApplicationSpec extends Specification {

  "Application" should {

    "send 404 on a bad request" in new WithApplication(TestApplication.app) {
      route(FakeRequest(GET, "/boum")) must beNone
    }

    "render the login page" in running(TestApplication.app) {
      val home = route(FakeRequest(GET, "/")).get
      // must redirect to login page
      status(home) must equalTo(SEE_OTHER)
      val x = redirectLocation(home).map { location =>
        location must equalTo("/login")
        val loginpage = route(FakeRequest(GET, "/login")) map { result =>
          status(result) must equalTo(OK)
          contentType(result) must beSome.which(_ == "text/html")
          contentAsString(result) must contain("Apps: Login")
        }
      }

      x must beSome
    }
  }
}

Я видел аналогичную ошибку, сообщенную здесь:

Я попытался добавить следующую строку в build.sbt, чтобы не разветвляться для каждого теста. Это тоже не помогло:

Keys.fork in (Test) := false

Обратите внимание на две вещи:

  • Фактическая ошибка: Configuration error[Cannot connect to database [default]] (Configuration.scala:92)
  • Это появляется три раза Stopping the application...

Что я могу сделать, чтобы решить эту проблему?


person tuxdna    schedule 17.07.2014    source источник


Ответы (1)


Я пытался избежать создания нового приложения каждый раз при запуске теста, поэтому я использовал:

lazy val app = FakeApplication(withGlobal = Some(MockGlobal))

Однако это неправильный подход. Для разветвленного теста после его завершения приложение останавливается, что делает его недоступным для других тестов. По этой причине я получал ошибки подключения к базе данных во всех тестах, кроме первого.

Я изменил определение спецификации теста

  • отсюда: in new WithApplication(TestApplication.app)
  • на это: in running(FakeApplication(withGlobal = Some(MockGlobal)))

Вот как это выглядит сейчас:

"render the login page" in running(FakeApplication(withGlobal = Some(MockGlobal))) {
  val home = route(FakeRequest(GET, "/")).get
  // must redirect to login page
  status(home) must equalTo(SEE_OTHER)
  val x = redirectLocation(home).map { location =>
    location must equalTo("/login")
    val loginpage = route(FakeRequest(GET, "/login")) map { result =>
      status(result) must equalTo(OK)
      contentType(result) must beSome.which(_ == "text/html")
      contentAsString(result) must contain("Apps: Login")
    }
  }

  x must beSome
}

Теперь все тесткейсы работают нормально. Я не вижу никакой ошибки Configuration error[Cannot connect to database [default]].

person tuxdna    schedule 18.07.2014