我有两种不同的slick.driver.PostgresDriver.simple.Database
val
s
e.g。
implicit val db : slick.driver.PostgresDriver.simple.Database = ProdDataSource.db
和
implicit val testdb : slick.driver.PostgresDriver.simple.Database = TestDataSource.db
唯一的区别是他们指向的数据库。 testdb
指向所有测试都使用的测试数据库。
我参与了所有接受(implicit db:Database)
e.g。
def save(emp: Employee)(implicit db : Database): Employee = db.withSession{implicit session => ...}
有Database
作为implicit
参数的原因,因此测试变得更容易,测试可以通过测试Database
。
现在,当从save
控制器调用以上Play
def时,它必须有一个implicit val db =...
给定的play
控制器object
什么是更好的方法是controllers
参数化(例如,如果它是class
我们可以传入类参数),以便能够使用适当的Database
正确测试控制器?
当前控制器如下所示,由于implicit val db
正在使用prod db,因此不可判断。测试需要inject
implicit val testdb
。
object MyController extends Controller {
implicit val db = ProdDataSource.db
我不想使用蛋糕模式,这使得代码难以工作和丑陋。什么是实现这一目标的最佳方式?
答案 0 :(得分:1)
如果控制器是一个类,你可以使它成为一个隐式参数,但我怀疑你可以告诉play将数据库作为参数传递给控制器。因此,要么使用mixin组合来为测试和生产提供不同的控制器实例。或者使用play config替换Play提供的两种情况。