12

我想在每个测试文件的开头手动运行我的进化脚本。我正在与 Play 合作!2.4 和光滑 3。

根据文档,要走的路似乎是:

Evolutions.applyEvolutions(database)

但我无法获得我的数据库实例。在文档 play.api.db.Databases中导入以获取数据库实例,但如果我尝试导入它,我会收到此错误:object Databases is not a member of package play.api.db

如何获取我的数据库实例以运行进化脚本?

编辑:如评论中所问,这是给出错误的整个源代码:

import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases

class TestAddressModel extends PlaySpec with OneAppPerSuite {
   lazy val appBuilder = new GuiceApplicationBuilder()
   lazy val injector = appBuilder.injector()
   lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]

  def beforeAll() = {
    //val database: Database = ???
    //Evolutions.applyEvolutions(database)
  }

  "test" must { 
     "test" in { } 
  } 
}
4

5 回答 5

11

我终于找到了这个解决方案。我用 Guice 注入:

lazy val appBuilder = new GuiceApplicationBuilder()

lazy val injector = appBuilder.injector()

lazy val databaseApi = injector.instanceOf[DBApi] //here is the important line

(你必须导入play.api.db.DBApi。)

在我的测试中,我只需执行以下操作(实际上我使用其他数据库进行测试):

override def beforeAll() = {
  Evolutions.applyEvolutions(databaseApi.database("default"))
}

override def afterAll() = {
  Evolutions.cleanupEvolutions(databaseApi.database("default"))
}
于 2015-10-28T18:51:51.580 回答
2

考虑到您使用的是 Play 2.4,其中进化被移到单独的模块中,您必须添加evolutions到您的项目依赖项。

libraryDependencies += evolutions
于 2015-10-28T14:57:36.377 回答
1

要访问play.api.db.Databases,您必须将 jdbc 添加到您的依赖项:

libraryDependencies += jdbc

希望它可以帮助一些经过这里的人。

编辑:代码将如下所示:

import play.api.db.Databases

val database = Databases(
  driver = "com.mysql.jdbc.Driver",
  url = "jdbc:mysql://localhost/test",
  name = "mydatabase",
  config = Map(
    "user" -> "test",
    "password" -> "secret"
  )
)

您现在有一个数据库实例,并且可以对其执行查询:

val statement = database.getConnection().createStatement()
val resultSet = statement.executeQuery("some_sql_query")

您可以从文档中看到更多信息

编辑:错字

于 2017-06-07T12:46:53.373 回答
0

我发现在应用进化的情况下运行测试的最简单方法是使用FakeApplication, 并手动输入数据库的连接信息。

def withDB[T](code: => T): T =
  // Create application to run database evolutions
  running(FakeApplication(additionalConfiguration = Map(
    "db.default.driver"   -> "<my-driver-class>",
    "db.default.url"      -> "<my-db-url>",
    "db.default.user"     -> "<my-db>",
    "db.default.password" -> "<my-password>",
    "evolutionplugin"     -> "enabled"
    ))) {
    // Start a db session
    withSession(code)
  }

像这样使用它:

"test" in withDB { }

例如,这允许您使用内存数据库来加速单元测试。

您可以根据需要访问数据库实例play.api.db.DB。您还需要import play.api.Play.current.

于 2015-10-28T15:05:34.220 回答
0

使用 FakeApplication 读取您的数据库配置并提供数据库实例。

def withDB[T](code: => T): T =
  // Create application to run database evolutions
  running(FakeApplication(additionalConfiguration = Map(
       "evolutionplugin" -> "disabled"))) {
    import play.api.Play.current
    val database = play.api.db.DB
    Evolutions.applyEvolutions(database)
    withSession(code)
    Evolutions.cleanupEvolutions(database)
  }

像这样使用它:

"test" in withDB { }
于 2015-10-28T16:10:00.180 回答