1

我正在尝试使用 Scalatest 在 Play Framework 2.1 测试套件中设置和拆除数据库

我们实际上已经设置了

 running(FakeApplication()){

 }

但我想在每个单独的测试之前设置数据库,根据我对 Scalatest 的理解,你可以这样做

override def beforeEach(){

}

所以我尝试从内部运行几个 Squeryl 查询,并得到一些关于会话关闭的错误。

所以我然后尝试在 beforeEach 方法中创建一个会话:

override def beforeEach(){
   import org.squeryl.SessionFactory

   Class.forName("org.postgresql.Driver").newInstance()
   // classOf[org.postgresql.Driver]
   DriverManager.registerDriver(new org.postgresql.Driver)
   val props = new Properties()
   props.setProperty("user","db")
   props.setProperty("password","db")
   SessionFactory.concreteFactory = Some(()=>
     Session.create(
    java.sql.DriverManager.getConnection("jdbc:postgresql://127.0.0.1/db", props),
    new PostgreSqlAdapter))

   CloudUsers.truncateUsers()
   Servers.truncateServers()
}

这已经清除了会话错误,但我现在得到:

Could not run test Controllers.UserTest: java.lang.ExceptionInInitializerError
Throwable escaped the test run of 'Controllers.UserTest':     java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
....
Caused by: java.lang.RuntimeException: There is no started application

所以简而言之,我可以在 Play 中运行 beforeEach 设置方法,还是只需要在每个测试的顶部使用一些引导程序来调整它?

谢谢

汤姆

4

2 回答 2

2

睡了一觉然后试着把

running(FakeApplication()) {
}

override def beforeEach(){

}

代码,这似乎可以解决问题,但不确定它对 Play 框架的影响(如果有的话),但现在可以完成工作。

于 2013-05-23T08:25:23.787 回答
0

来自BeforeAndAfterEach特征的 beforeEach 方法只能在 ScalaTest 测试中使用,而不能在应用程序本身中使用。

它可以混合到需要在运行每个测试之前和之后调用的方法的套件中。

所以是的,这个fixture 的创建是为了在套件运行每个测试之前进行一些设置。您可以在此处阅读有关此和其他一些 ScalaTest 固定装置的信息

于 2013-05-22T22:47:46.957 回答