有一个播放控制器方法
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
测试运行时不会污染数据库。测试不应该在db中保留任何内容,而是在成功执行后回滚。
现在,当测试play
controller
需要一种方法来使用sessionWrapper
时。能够以与service
测试类似的方式回滚控制器测试。
MyDataSourceProvider.db.withSession
中注意controller insertDepartment
。
将controller
测试与sessionWrapper
包装没有任何意义,因为控制器def
不接受任何implicit session
但使用来自MyDataSourceProvider.db.withSession
的{{1}} {1}}
最好的办法是什么?尝试创建一个trait
控制器,以inject
为trait
进行推测,因此mixin对于测试和真实代码可能会有所不同,但还没有找到方法来#&} 34;通过" session
用于测试,不用于生产代码。有什么想法吗?
答案 0 :(得分:0)
由于Slick阻止,您不需要Action.async
。我想知道为什么甚至会编译,因为我不会在那里看到未来,但我对Play并不熟悉。
您可以采取以下几种方法:
拉出
val departmentRow = DepartmentRow(1, Option("Department1"))
departmentService.insert(departmentRow)
进入方法并只测试该方法,而不是控制器