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
测试没有任何意义,因为controllerdef
不接受任何隐式会话
,而是使用MyDataSourceProvider.db.with session
最好的处理方法是什么?尝试创建一个trait
控制器,以便能够为trait
注入impl,这样mixin对于测试和实际代码可能不同,但对于测试和生产代码,还没有找到“通过”会话的方法。有什么想法吗?因为Slick正在阻塞,所以您不需要Action.async
。我想知道为什么会有这样的结果,因为我看不到未来,但我对这个游戏不太熟悉
您可以选择以下几种方法:
我的最爱:不要在测试中使用事务回滚,而是使用一个测试数据库,您可以为每个测试重新创建该数据库
拔出
val departmentRow = DepartmentRow(1, Option("Department1"))
departmentService.insert(departmentRow)
并只测试该方法,而不是控制器
在控制器中使用sessionWrapper,让它检查配置标志,该标志告诉它是否处于测试模式,是否应该执行回滚,或者是否处于生产模式