如何使用Play控制器对象注入不同的Slick数据源进行测试?

时间:2014-09-09 21:03:58

标签: scala playframework slick

我有两种不同的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)

的API

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

我不想使用蛋糕模式,这使得代码难以工作和丑陋。什么是实现这一目标的最佳方式?

1 个答案:

答案 0 :(得分:1)

如果控制器是一个类,你可以使它成为一个隐式参数,但我怀疑你可以告诉play将数据库作为参数传递给控制器​​。因此,要么使用mixin组合来为测试和生产提供不同的控制器实例。或者使用play config替换Play提供的两种情况。