如何使用 Slick and Play 在测试中应用手动演化! 2.4
How to apply manually evolutions in tests with Slick and Play! 2.4
我想在每个测试文件的开头手动 运行 我的进化脚本。我正在与 Play 合作! 2.4 和 Slick 3.
根据文档,要走的路似乎是:
Evolutions.applyEvolutions(database)
但我无法获取数据库的实例。在 documentation 中导入 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 { }
}
}
考虑到您使用的是 Play 2.4,其中 evolutions 被移到了一个单独的模块中,您必须将 evolutions
添加到您的项目依赖项中。
libraryDependencies += evolutions
我发现 运行 应用进化测试的最简单方法是使用 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
.
使用 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 { }
我终于找到了这个解决方案。我用 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"))
}
要访问 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")
您可以从docs
中看到更多
编辑:打字错误
我想在每个测试文件的开头手动 运行 我的进化脚本。我正在与 Play 合作! 2.4 和 Slick 3.
根据文档,要走的路似乎是:
Evolutions.applyEvolutions(database)
但我无法获取数据库的实例。在 documentation 中导入 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 { }
}
}
考虑到您使用的是 Play 2.4,其中 evolutions 被移到了一个单独的模块中,您必须将 evolutions
添加到您的项目依赖项中。
libraryDependencies += evolutions
我发现 运行 应用进化测试的最简单方法是使用 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
.
使用 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 { }
我终于找到了这个解决方案。我用 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"))
}
要访问 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")
您可以从docs
中看到更多编辑:打字错误