Scala 滑动和播放控制器测试

Scala 滑动和播放控制器测试,scala,playframework,slick,Scala,Playframework,Slick,有一个播放控制器方法 def insertDepartment = Action(parse.json) { request => MyDataSourceProvider.db.withSession{ implicit session => val departmentRow = DepartmentRow(1, Option("Department1")) departmentService.insert(departmentRow) } } 注意My

有一个播放控制器方法

def insertDepartment = Action(parse.json) { request =>
  MyDataSourceProvider.db.withSession{ implicit session =>
    val departmentRow = DepartmentRow(1, Option("Department1"))
    departmentService.insert(departmentRow)
  }
}
注意
MyDataSourceProvider.db
提供了
slick.driver.PostgresDriver.simple.Database
,并使用session创建了
,为
部门服务提供了
隐式
会话

当我测试
部门服务时
会话
由中提到的文本夹具提供
sessionWrapper
是一个简单的函数,它创建一个
会话
,向测试块提供
会话
,并在测试完成后回滚数据

sessionWrapper { implicit session =>

    val departmentRow = DepartmentRow(1, Option("Department1"))
    departmentService.insert(departmentRow)
}
服务
测试运行时,它不会污染数据库,因此工作正常。测试不应该在数据库中保留任何内容,而是在成功执行后回滚

现在,当测试
play
controller
时,需要一种使用
sessionWrapper
的方法。能够以与
服务
测试类似的方式回滚控制器测试

注意
controller insertDepartment
中的
MyDataSourceProvider.db.with session

使用
sessionWrapper
包装
controller
测试没有任何意义,因为controller
def
不接受任何
隐式会话
,而是使用
MyDataSourceProvider.db.with session


最好的处理方法是什么?尝试创建一个
trait
控制器,以便能够
trait
注入
impl,这样mixin对于测试和实际代码可能不同,但对于测试和生产代码,还没有找到“通过”会话的方法。有什么想法吗?

因为Slick正在阻塞,所以您不需要
Action.async
。我想知道为什么会有这样的结果,因为我看不到未来,但我对这个游戏不太熟悉

您可以选择以下几种方法:

  • 我的最爱:不要在测试中使用事务回滚,而是使用一个测试数据库,您可以为每个测试重新创建该数据库
  • 拔出

    val departmentRow = DepartmentRow(1, Option("Department1"))
        departmentService.insert(departmentRow)
    
    并只测试该方法,而不是控制器

  • 在控制器中使用sessionWrapper,让它检查配置标志,该标志告诉它是否处于测试模式,是否应该执行回滚,或者是否处于生产模式