【发布时间】:2014-09-14 15:03:35
【问题描述】:
有一个播放控制器方法
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 并创建withSession 提供implicit session 到departmentService.insert
当我测试departmentService 时,session 由this post 中提到的文本夹具提供。 sessionWrapper 是一个简单的函数,它创建一个session,将session 提供给一个测试块,并在测试完成后回滚数据。
sessionWrapper { implicit session =>
val departmentRow = DepartmentRow(1, Option("Department1"))
departmentService.insert(departmentRow)
}
当service 测试运行时不会污染数据库,这可以很好地工作并且符合预期。测试不应该在数据库中持久化任何东西,而是在成功执行后回滚。
现在在测试play controller 时需要一种使用sessionWrapper 的方法。能够以与service 测试类似的方式回滚控制器测试。
在controller insertDepartment 中注明MyDataSourceProvider.db.withSession。
用sessionWrapper 包装controller test 没有意义,因为控制器def 不接受任何implicit session,而是使用MyDataSourceProvider.db.withSession 中的一个
处理此问题的最佳方法是什么?尝试创建一个trait 控制器,以便能够inject impl 为trait,因此对于测试和实际代码,mixin 可能会有所不同,但还没有找到一种方法来“通过”session 进行测试和 not 用于生产代码。有什么想法吗?
【问题讨论】:
标签: scala playframework slick