在 Play 中为 OneAppPerTest 中的每个测试重新创建数据库并进化

Posted

技术标签:

【中文标题】在 Play 中为 OneAppPerTest 中的每个测试重新创建数据库并进化【英文标题】:Recreate database in Play with evolution for each test in OneAppPerTest 【发布时间】:2016-03-09 16:06:56 【问题描述】:

我正在使用 Play-Slick 的 Playframework 2.4.6(想更新到新版本 2.5.0)。

我在更改单元和集成测试时遇到问题。 当我想测试我的控制器时,我需要每个测试都处于默认状态的数据库。这意味着每次测试都应该运行进化。

在我的测试中,我使用的是 h2 InMemory 数据库。

我尝试在我的 testApplication.conf 中设置值:

play.evolutions.autoApply=true
play.evolutions.autoApplyDowns=true
evolutionplugin=enabled
applyEvolutions.default=true
applyDownEvolutions.default=true

没有成功。

我正在使用 OneAppPerTest trait,因为我希望这个 trait 会为每个测试用例重置数据库。 没有成功。

这是我的测试用例设置:

class MyControllerTest extends FunSuite with OneAppPerTest with OptionValues with MockitoSugar  

  implicit override def newAppForTest(td: TestData) = new GuiceApplicationBuilder()
    .configure(Map("ehcacheplugin" -> "disabled", "applyDownEvolutions.default" -> "true"))
    .build()

对于每个测试,我从 Guice 获取控制器:

test("test 1") 
    val controller = app.injector.instanceOf[MyController]
    controller.changeDB // Change

当我在控制器上调用我的方法时,它会更改数据库。这个变化在我的第二个测试用例中仍然存在。

请帮忙。

【问题讨论】:

【参考方案1】:

好的,它适用于:

    使用BeforeAndAfterEach trait 增强测试类

    写一个方法:

override def afterEach() 
  lazy val databaseApi = app.injector.instanceOf[DBApi]
  val db = databaseApi.database("default")
  Evolutions.cleanupEvolutions(

【讨论】:

以上是关于在 Play 中为 OneAppPerTest 中的每个测试重新创建数据库并进化的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 控制台中为登台和制作单独的实时通知

如何在 Play 商店中为您的应用手动下载扩展 (obb) 文件?

未针对某些内部用户在 Play 商店中为 Alpha 测试人员更新应用程序

在 Play Framework 2.4 中为 Scala 实现 Akka

在 Play 2.1 和 Scala 中为文件上传编写测试用例

在 Google Play 中为 aab 映射文件