scala – 如何在play-framework中运行测试时应用play-evolutions
使用play框架运行测试时,我遇到了进化问题
>用于scala的playframework v2.6.6 测试看起来像这样: class TestFooController extends PlaySpec with GuiceOneServerPerSuite { "foo endpoint should store some data" in { val wsClient = app.injector.instanceOf[WSClient] val url = s"http://localhost:$port/foo" val requestData = Json.obj("foo" -> "bar") val response = await(wsClient.url(url).post(requestData)) response.status mustBe OK } } 数据库配置如下所示: slick.dbs.default.driver="slick.driver.H2Driver$" slick.dbs.default.db.driver="org.h2.Driver" slick.dbs.default.db.url="jdbc:h2:mem:play" 假设有一个创建表foos的进化脚本,这个脚本在开发模式下工作正常. 运行测试时会引发以下错误: play.api.http.HttpErrorHandlerExceptions $$anon $1:执行异常[[JdbcSQLException:表“foos”未找到; 找不到表格,所以我假设数据库演变尚未应用. 然后我将数据库配置更改为在开发模式下使用的postgresql. slick.dbs.default.driver = "slick.driver.PostgresDriver$" slick.dbs.default.db.driver = "org.postgresql.Driver" slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/foo-test" slick.dbs.default.db.user = "user" slick.dbs.default.db.password = "password" 使用此配置,测试工作正常,数据存储在数据库中,因此数据库演进运行得很好. 现在的问题是,测试后数据库没有被清除.我想用干净的数据库运行每个测试套件. 总结一下.由于不应用H2Db演变,应用postgresql演变但未清除. 即使这在application.test.conf中明确定义 play.evolutions.autoApply=true play.evolutions.autoApplyDowns=true 我也试过了 play.evolutions.db.default.autoApply=true play.evolutions.db.default.autoApplyDowns=true 没有效果. 然后我尝试通过以下手动执行此操作: def withManagedDatabase[T](block: Database => T): Unit = { val dbapi = app.injector.instanceOf[DBApi] val database = dbapi.database("default") Evolutions.applyEvolutions(database) block(database) Evolutions.cleanupEvolutions(database) } 然后将测试更改为: "foo endpoint should store some data" in withManagedDatabase { _ => ... } 对于H2数据库配置它没有任何影响,抛出无法找到表foos的相同错误.对于postgresql数据库配置,抛出了进化异常 play.api.db.evolutions.InconsistentDatabase:数据库’default’处于不一致状态![演变尚未正确应用.请检查问题并手动解决,然后再将其标记为已解决.] 我希望在每个测试套件之后运行之前的进化运行和进化运行.怎么能实现这一目标? 解决方法
这对我有用:
class DAOSpec extends PlaySpec with GuiceOneAppPerSuite { val dbUrl = sys.env.getOrElse("DATABASE_URL","postgres://foo:password@localhost:5432/foo") val testConfig = Map("db.default.url" -> dbUrl) implicit override def fakeApplication() = new GuiceApplicationBuilder().configure(testConfig).build() lazy val database = app.injector.instanceOf[Database] lazy val dao = app.injector.instanceOf[DAO] "create" must { "work" in Evolutions.withEvolutions(database) { val foo = await(dao.create("foo")) foo.id must not be null } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |